优化:发送失败重试简化配置、机制优化(手动请求时不重试)

pull/115/head
pppscn 3 years ago
parent c011f6f811
commit 3f8f37c59b

@ -1,5 +1,6 @@
package com.idormy.sms.forwarder; package com.idormy.sms.forwarder;
import android.annotation.SuppressLint;
import android.app.ActivityManager; import android.app.ActivityManager;
import android.app.Application; import android.app.Application;
import android.content.Context; import android.content.Context;
@ -29,6 +30,7 @@ public class MyApplication extends Application {
//是否关闭页面提示 //是否关闭页面提示
public static boolean showHelpTip = true; public static boolean showHelpTip = true;
SharedPreferencesHelper sharedPreferencesHelper; SharedPreferencesHelper sharedPreferencesHelper;
@SuppressLint("StaticFieldLeak")
private static Context context; private static Context context;
@Override @Override

@ -102,15 +102,8 @@ public class SettingActivity extends AppCompatActivity {
batterySetting(findViewById(R.id.switch_battery_setting)); batterySetting(findViewById(R.id.switch_battery_setting));
//不在最近任务列表中显示 //不在最近任务列表中显示
switchExcludeFromRecents(findViewById(R.id.switch_exclude_from_recents)); switchExcludeFromRecents(findViewById(R.id.switch_exclude_from_recents));
//是否开启失败重试
switchRetryDelay(findViewById(R.id.switch_retry_delay));
//接口请求失败重试时间间隔 //接口请求失败重试时间间隔
editRetryDelayTime(findViewById(R.id.et_retry_delay_time1), 1); editRetryDelayTime(findViewById(R.id.et_retry_times), findViewById(R.id.et_delay_time));
editRetryDelayTime(findViewById(R.id.et_retry_delay_time2), 2);
editRetryDelayTime(findViewById(R.id.et_retry_delay_time3), 3);
editRetryDelayTime(findViewById(R.id.et_retry_delay_time4), 4);
editRetryDelayTime(findViewById(R.id.et_retry_delay_time5), 5);
//设备备注 //设备备注
editAddExtraDeviceMark(findViewById(R.id.et_add_extra_device_mark)); editAddExtraDeviceMark(findViewById(R.id.et_add_extra_device_mark));
@ -589,32 +582,31 @@ public class SettingActivity extends AppCompatActivity {
}); });
} }
//是否开启失败重试 //接口请求失败重试时间间隔
@SuppressLint("UseSwitchCompatOrMaterialCode") private void editRetryDelayTime(final EditText et_retry_times, final EditText et_delay_time) {
private void switchRetryDelay(Switch switch_retry_delay) { et_retry_times.setText(String.valueOf(SettingUtil.getRetryTimes()));
switch_retry_delay.setChecked(SettingUtil.getSwitchRetryDelay()); et_retry_times.addTextChangedListener(new TextWatcher() {
@Override
switch_retry_delay.setOnCheckedChangeListener((buttonView, isChecked) -> { public void beforeTextChanged(CharSequence s, int start, int count, int after) {
if (isChecked
&& SettingUtil.getRetryDelayTime(1) == 0
&& SettingUtil.getRetryDelayTime(2) == 0
&& SettingUtil.getRetryDelayTime(3) == 0
&& SettingUtil.getRetryDelayTime(4) == 0
&& SettingUtil.getRetryDelayTime(5) == 0) {
Toast.makeText(context, "所有间隔时间都为0无法启用", Toast.LENGTH_SHORT).show();
SettingUtil.switchRetryDelay(false);
return;
} }
SettingUtil.switchRetryDelay(isChecked);
Log.d(TAG, "switchRetryDelay:" + isChecked);
});
}
//接口请求失败重试时间间隔 @Override
private void editRetryDelayTime(final EditText et_retry_delay_time, final int index) { public void onTextChanged(CharSequence s, int start, int before, int count) {
et_retry_delay_time.setText(String.valueOf(SettingUtil.getRetryDelayTime(index))); }
@Override
public void afterTextChanged(Editable s) {
String retryTimes = et_retry_times.getText().toString().trim();
if (!retryTimes.isEmpty()) {
SettingUtil.setRetryTimes(Integer.parseInt(retryTimes));
} else {
SettingUtil.setRetryTimes(0);
}
}
});
et_retry_delay_time.addTextChangedListener(new TextWatcher() { et_delay_time.setText(String.valueOf(SettingUtil.getDelayTime()));
et_delay_time.addTextChangedListener(new TextWatcher() {
@Override @Override
public void beforeTextChanged(CharSequence s, int start, int count, int after) { public void beforeTextChanged(CharSequence s, int start, int count, int after) {
} }
@ -625,20 +617,11 @@ public class SettingActivity extends AppCompatActivity {
@Override @Override
public void afterTextChanged(Editable s) { public void afterTextChanged(Editable s) {
String delayTime = et_retry_delay_time.getText().toString().trim(); String delayTime = et_delay_time.getText().toString().trim();
if (!delayTime.isEmpty()) { if (!delayTime.isEmpty()) {
SettingUtil.setRetryDelayTime(index, Integer.parseInt(delayTime)); SettingUtil.setDelayTime(Integer.parseInt(delayTime));
} else { } else {
SettingUtil.setRetryDelayTime(index, 0); SettingUtil.setDelayTime(1);
}
if (SettingUtil.getRetryDelayTime(1) == 0
&& SettingUtil.getRetryDelayTime(2) == 0
&& SettingUtil.getRetryDelayTime(3) == 0
&& SettingUtil.getRetryDelayTime(4) == 0
&& SettingUtil.getRetryDelayTime(5) == 0) {
Toast.makeText(context, "所有间隔时间都为0自动禁用失败重试", Toast.LENGTH_SHORT).show();
SettingUtil.switchRetryDelay(false);
} }
} }
}); });

@ -40,12 +40,17 @@ import com.idormy.sms.forwarder.model.vo.WebNotifySettingVo;
import com.idormy.sms.forwarder.utils.LogUtil; import com.idormy.sms.forwarder.utils.LogUtil;
import com.idormy.sms.forwarder.utils.NetUtil; import com.idormy.sms.forwarder.utils.NetUtil;
import com.idormy.sms.forwarder.utils.RuleUtil; import com.idormy.sms.forwarder.utils.RuleUtil;
import com.idormy.sms.forwarder.utils.SettingUtil;
import java.text.ParseException; import java.text.ParseException;
import java.text.SimpleDateFormat; import java.text.SimpleDateFormat;
import java.util.Date; import java.util.Date;
import java.util.List; import java.util.List;
import java.util.Locale; import java.util.Locale;
import java.util.concurrent.TimeUnit;
import io.reactivex.rxjava3.core.Observable;
import io.reactivex.rxjava3.core.ObservableEmitter;
public class SendUtil { public class SendUtil {
private static final String TAG = "SendUtil"; private static final String TAG = "SendUtil";
@ -128,7 +133,7 @@ public class SendUtil {
for (SenderModel senderModel : senderModels) { for (SenderModel senderModel : senderModels) {
String smsTemplate = ruleModel.getSwitchSmsTemplate() ? ruleModel.getSmsTemplate() : ""; String smsTemplate = ruleModel.getSwitchSmsTemplate() ? ruleModel.getSmsTemplate() : "";
String regexReplace = ruleModel.getSwitchRegexReplace() ? ruleModel.getRegexReplace() : ""; String regexReplace = ruleModel.getSwitchRegexReplace() ? ruleModel.getRegexReplace() : "";
SendUtil.senderSendMsg(handler, smsVo, senderModel, logVo.getId(), smsTemplate, regexReplace); SendUtil.senderSendMsg(handler, null, smsVo, senderModel, logVo.getId(), smsTemplate, regexReplace);
} }
} }
} catch (Exception e) { } catch (Exception e) {
@ -162,15 +167,47 @@ public class SendUtil {
for (SenderModel senderModel : senderModels) { for (SenderModel senderModel : senderModels) {
String smsTemplate = ruleModel.getSwitchSmsTemplate() ? ruleModel.getSmsTemplate() : ""; String smsTemplate = ruleModel.getSwitchSmsTemplate() ? ruleModel.getSmsTemplate() : "";
String regexReplace = ruleModel.getSwitchRegexReplace() ? ruleModel.getRegexReplace() : ""; String regexReplace = ruleModel.getSwitchRegexReplace() ? ruleModel.getRegexReplace() : "";
SendUtil.senderSendMsg(handError, smsVo, senderModel, 0, smsTemplate, regexReplace); SendUtil.senderSendMsg(handError, null, smsVo, senderModel, 0, smsTemplate, regexReplace);
} }
} }
@SuppressWarnings("ResultOfMethodCallIgnored")
public static void senderSendMsgNoHandError(SmsVo smsVo, SenderModel senderModel, long logId, String smsTemplate, String regexReplace) { public static void senderSendMsgNoHandError(SmsVo smsVo, SenderModel senderModel, long logId, String smsTemplate, String regexReplace) {
SendUtil.senderSendMsg(null, smsVo, senderModel, logId, smsTemplate, regexReplace); //网络请求+重试比较耗时,创建子线程处理
// new Thread(new Runnable() {
// @Override
// public void run() {
//是否需要失败重试
int retryTimes = SettingUtil.getRetryTimes();
if (retryTimes < 1) {
SendUtil.senderSendMsg(null, null, smsVo, senderModel, logId, smsTemplate, regexReplace);
return;
}
try {
int delayTime = SettingUtil.getDelayTime();
Observable
.create(emitter -> {
Log.w(TAG, "RxJava 开始请求接口...");
SendUtil.senderSendMsg(null, emitter, smsVo, senderModel, logId, smsTemplate, regexReplace);
})
.retryWhen(attempts -> attempts.zipWith(Observable.range(1, retryTimes), (n, i) -> i).flatMap(i -> {
long delay = (long) i * delayTime;
Log.w(TAG, "RxJava 请求接口异常," + delay + "秒后重试");
return Observable.timer(delay, TimeUnit.SECONDS);
}).concatWith(Observable.error(new RuntimeException("请求接口失败,已重试 " + retryTimes + " 次"))))
.subscribe(
(i) -> System.out.println("onNext with " + i),
(error) -> System.out.println("OnError with " + error)
);
} catch (Exception e) {
Log.e(TAG, e.getMessage());
}
// }
// }).start();//启动线程
} }
public static void senderSendMsg(Handler handError, SmsVo smsVo, SenderModel senderModel, long logId, String smsTemplate, String regexReplace) { public static void senderSendMsg(Handler handError, ObservableEmitter<Object> emitter, SmsVo smsVo, SenderModel senderModel, long logId, String smsTemplate, String regexReplace) {
Log.i(TAG, "senderSendMsg smsVo:" + smsVo.toString() + "senderModel:" + senderModel.toString()); Log.i(TAG, "senderSendMsg smsVo:" + smsVo.toString() + "senderModel:" + senderModel.toString());
@ -187,7 +224,7 @@ public class SendUtil {
DingDingSettingVo dingDingSettingVo = JSON.parseObject(senderModel.getJsonSetting(), DingDingSettingVo.class); DingDingSettingVo dingDingSettingVo = JSON.parseObject(senderModel.getJsonSetting(), DingDingSettingVo.class);
if (dingDingSettingVo != null) { if (dingDingSettingVo != null) {
try { try {
SenderDingdingMsg.sendMsg(logId, handError, dingDingSettingVo.getToken(), dingDingSettingVo.getSecret(), dingDingSettingVo.getAtMobiles(), dingDingSettingVo.getAtAll(), smsVo.getSmsVoForSend(smsTemplate, regexReplace)); SenderDingdingMsg.sendMsg(logId, handError, emitter, dingDingSettingVo.getToken(), dingDingSettingVo.getSecret(), dingDingSettingVo.getAtMobiles(), dingDingSettingVo.getAtAll(), smsVo.getSmsVoForSend(smsTemplate, regexReplace));
} catch (Exception e) { } catch (Exception e) {
LogUtil.updateLog(logId, 0, e.getMessage()); LogUtil.updateLog(logId, 0, e.getMessage());
Log.e(TAG, "senderSendMsg: dingding error " + e.getMessage()); Log.e(TAG, "senderSendMsg: dingding error " + e.getMessage());
@ -202,7 +239,7 @@ public class SendUtil {
EmailSettingVo emailSettingVo = JSON.parseObject(senderModel.getJsonSetting(), EmailSettingVo.class); EmailSettingVo emailSettingVo = JSON.parseObject(senderModel.getJsonSetting(), EmailSettingVo.class);
if (emailSettingVo != null) { if (emailSettingVo != null) {
try { try {
SenderMailMsg.sendEmail(logId, handError, emailSettingVo.getProtocol(), emailSettingVo.getHost(), emailSettingVo.getPort(), emailSettingVo.getSsl(), emailSettingVo.getFromEmail(), emailSettingVo.getNickname(), SenderMailMsg.sendEmail(logId, handError, emitter, emailSettingVo.getProtocol(), emailSettingVo.getHost(), emailSettingVo.getPort(), emailSettingVo.getSsl(), emailSettingVo.getFromEmail(), emailSettingVo.getNickname(),
emailSettingVo.getPwd(), emailSettingVo.getToEmail(), smsVo.getTitleForSend(emailSettingVo.getTitle(), regexReplace), smsVo.getSmsVoForSend(smsTemplate, regexReplace)); emailSettingVo.getPwd(), emailSettingVo.getToEmail(), smsVo.getTitleForSend(emailSettingVo.getTitle(), regexReplace), smsVo.getSmsVoForSend(smsTemplate, regexReplace));
} catch (Exception e) { } catch (Exception e) {
LogUtil.updateLog(logId, 0, e.getMessage()); LogUtil.updateLog(logId, 0, e.getMessage());
@ -218,7 +255,7 @@ public class SendUtil {
BarkSettingVo barkSettingVo = JSON.parseObject(senderModel.getJsonSetting(), BarkSettingVo.class); BarkSettingVo barkSettingVo = JSON.parseObject(senderModel.getJsonSetting(), BarkSettingVo.class);
if (barkSettingVo != null) { if (barkSettingVo != null) {
try { try {
SenderBarkMsg.sendMsg(logId, handError, barkSettingVo.getServer(), barkSettingVo.getIcon(), smsVo.getMobile(), smsVo.getSmsVoForSend(smsTemplate, regexReplace), senderModel.getName()); SenderBarkMsg.sendMsg(logId, handError, emitter, barkSettingVo.getServer(), barkSettingVo.getIcon(), smsVo.getMobile(), smsVo.getSmsVoForSend(smsTemplate, regexReplace), senderModel.getName());
} catch (Exception e) { } catch (Exception e) {
LogUtil.updateLog(logId, 0, e.getMessage()); LogUtil.updateLog(logId, 0, e.getMessage());
Log.e(TAG, "senderSendMsg: SenderBarkMsg error " + e.getMessage()); Log.e(TAG, "senderSendMsg: SenderBarkMsg error " + e.getMessage());
@ -233,7 +270,7 @@ public class SendUtil {
WebNotifySettingVo webNotifySettingVo = JSON.parseObject(senderModel.getJsonSetting(), WebNotifySettingVo.class); WebNotifySettingVo webNotifySettingVo = JSON.parseObject(senderModel.getJsonSetting(), WebNotifySettingVo.class);
if (webNotifySettingVo != null) { if (webNotifySettingVo != null) {
try { try {
SenderWebNotifyMsg.sendMsg(logId, handError, webNotifySettingVo.getWebServer(), webNotifySettingVo.getWebParams(), webNotifySettingVo.getSecret(), webNotifySettingVo.getMethod(), smsVo.getMobile(), smsVo.getSmsVoForSend(smsTemplate, regexReplace)); SenderWebNotifyMsg.sendMsg(logId, handError, emitter, webNotifySettingVo.getWebServer(), webNotifySettingVo.getWebParams(), webNotifySettingVo.getSecret(), webNotifySettingVo.getMethod(), smsVo.getMobile(), smsVo.getSmsVoForSend(smsTemplate, regexReplace));
} catch (Exception e) { } catch (Exception e) {
LogUtil.updateLog(logId, 0, e.getMessage()); LogUtil.updateLog(logId, 0, e.getMessage());
Log.e(TAG, "senderSendMsg: SenderWebNotifyMsg error " + e.getMessage()); Log.e(TAG, "senderSendMsg: SenderWebNotifyMsg error " + e.getMessage());
@ -248,7 +285,7 @@ public class SendUtil {
QYWXGroupRobotSettingVo qywxGroupRobotSettingVo = JSON.parseObject(senderModel.getJsonSetting(), QYWXGroupRobotSettingVo.class); QYWXGroupRobotSettingVo qywxGroupRobotSettingVo = JSON.parseObject(senderModel.getJsonSetting(), QYWXGroupRobotSettingVo.class);
if (qywxGroupRobotSettingVo != null) { if (qywxGroupRobotSettingVo != null) {
try { try {
SenderQyWxGroupRobotMsg.sendMsg(logId, handError, qywxGroupRobotSettingVo.getWebHook(), smsVo.getMobile(), smsVo.getSmsVoForSend(smsTemplate, regexReplace)); SenderQyWxGroupRobotMsg.sendMsg(logId, handError, emitter, qywxGroupRobotSettingVo.getWebHook(), smsVo.getMobile(), smsVo.getSmsVoForSend(smsTemplate, regexReplace));
} catch (Exception e) { } catch (Exception e) {
LogUtil.updateLog(logId, 0, e.getMessage()); LogUtil.updateLog(logId, 0, e.getMessage());
Log.e(TAG, "senderSendMsg: SenderQyWxGroupRobotMsg error " + e.getMessage()); Log.e(TAG, "senderSendMsg: SenderQyWxGroupRobotMsg error " + e.getMessage());
@ -263,7 +300,7 @@ public class SendUtil {
QYWXAppSettingVo qYWXAppSettingVo = JSON.parseObject(senderModel.getJsonSetting(), QYWXAppSettingVo.class); QYWXAppSettingVo qYWXAppSettingVo = JSON.parseObject(senderModel.getJsonSetting(), QYWXAppSettingVo.class);
if (qYWXAppSettingVo != null) { if (qYWXAppSettingVo != null) {
try { try {
SenderQyWxAppMsg.sendMsg(logId, handError, senderModel, qYWXAppSettingVo, smsVo.getSmsVoForSend(smsTemplate, regexReplace)); SenderQyWxAppMsg.sendMsg(logId, handError, emitter, senderModel, qYWXAppSettingVo, smsVo.getSmsVoForSend(smsTemplate, regexReplace));
} catch (Exception e) { } catch (Exception e) {
LogUtil.updateLog(logId, 0, e.getMessage()); LogUtil.updateLog(logId, 0, e.getMessage());
Log.e(TAG, "senderSendMsg: qywx_app error " + e.getMessage()); Log.e(TAG, "senderSendMsg: qywx_app error " + e.getMessage());
@ -278,7 +315,7 @@ public class SendUtil {
ServerChanSettingVo serverChanSettingVo = JSON.parseObject(senderModel.getJsonSetting(), ServerChanSettingVo.class); ServerChanSettingVo serverChanSettingVo = JSON.parseObject(senderModel.getJsonSetting(), ServerChanSettingVo.class);
if (serverChanSettingVo != null) { if (serverChanSettingVo != null) {
try { try {
SenderServerChanMsg.sendMsg(logId, handError, serverChanSettingVo.getSendKey(), smsVo.getMobile(), smsVo.getSmsVoForSend(smsTemplate, regexReplace)); SenderServerChanMsg.sendMsg(logId, handError, emitter, serverChanSettingVo.getSendKey(), smsVo.getMobile(), smsVo.getSmsVoForSend(smsTemplate, regexReplace));
} catch (Exception e) { } catch (Exception e) {
LogUtil.updateLog(logId, 0, e.getMessage()); LogUtil.updateLog(logId, 0, e.getMessage());
Log.e(TAG, "senderSendMsg: SenderServerChanMsg error " + e.getMessage()); Log.e(TAG, "senderSendMsg: SenderServerChanMsg error " + e.getMessage());
@ -293,7 +330,7 @@ public class SendUtil {
TelegramSettingVo telegramSettingVo = JSON.parseObject(senderModel.getJsonSetting(), TelegramSettingVo.class); TelegramSettingVo telegramSettingVo = JSON.parseObject(senderModel.getJsonSetting(), TelegramSettingVo.class);
if (telegramSettingVo != null) { if (telegramSettingVo != null) {
try { try {
SenderTelegramMsg.sendMsg(logId, handError, telegramSettingVo, smsVo.getMobile(), smsVo.getSmsVoForSend(smsTemplate, regexReplace), telegramSettingVo.getMethod()); SenderTelegramMsg.sendMsg(logId, handError, emitter, telegramSettingVo, smsVo.getMobile(), smsVo.getSmsVoForSend(smsTemplate, regexReplace), telegramSettingVo.getMethod());
} catch (Exception e) { } catch (Exception e) {
LogUtil.updateLog(logId, 0, e.getMessage()); LogUtil.updateLog(logId, 0, e.getMessage());
Log.e(TAG, "senderSendMsg: SenderTelegramMsg error " + e.getMessage()); Log.e(TAG, "senderSendMsg: SenderTelegramMsg error " + e.getMessage());
@ -335,7 +372,7 @@ public class SendUtil {
FeiShuSettingVo feiShuSettingVo = JSON.parseObject(senderModel.getJsonSetting(), FeiShuSettingVo.class); FeiShuSettingVo feiShuSettingVo = JSON.parseObject(senderModel.getJsonSetting(), FeiShuSettingVo.class);
if (feiShuSettingVo != null) { if (feiShuSettingVo != null) {
try { try {
SenderFeishuMsg.sendMsg(logId, handError, feiShuSettingVo.getWebhook(), feiShuSettingVo.getSecret(), smsVo.getMobile(), smsVo.getDate(), smsVo.getSmsVoForSend(smsTemplate, regexReplace)); SenderFeishuMsg.sendMsg(logId, handError, emitter, feiShuSettingVo.getWebhook(), feiShuSettingVo.getSecret(), smsVo.getMobile(), smsVo.getDate(), smsVo.getSmsVoForSend(smsTemplate, regexReplace));
} catch (Exception e) { } catch (Exception e) {
LogUtil.updateLog(logId, 0, e.getMessage()); LogUtil.updateLog(logId, 0, e.getMessage());
Log.e(TAG, "senderSendMsg: feishu error " + e.getMessage()); Log.e(TAG, "senderSendMsg: feishu error " + e.getMessage());
@ -350,7 +387,7 @@ public class SendUtil {
PushPlusSettingVo pushPlusSettingVo = JSON.parseObject(senderModel.getJsonSetting(), PushPlusSettingVo.class); PushPlusSettingVo pushPlusSettingVo = JSON.parseObject(senderModel.getJsonSetting(), PushPlusSettingVo.class);
if (pushPlusSettingVo != null) { if (pushPlusSettingVo != null) {
try { try {
SenderPushPlusMsg.sendMsg(logId, handError, pushPlusSettingVo, smsVo.getMobile(), smsVo.getSmsVoForSend(smsTemplate, regexReplace)); SenderPushPlusMsg.sendMsg(logId, handError, emitter, pushPlusSettingVo, smsVo.getMobile(), smsVo.getSmsVoForSend(smsTemplate, regexReplace));
} catch (Exception e) { } catch (Exception e) {
LogUtil.updateLog(logId, 0, e.getMessage()); LogUtil.updateLog(logId, 0, e.getMessage());
Log.e(TAG, "senderSendMsg: feishu error " + e.getMessage()); Log.e(TAG, "senderSendMsg: feishu error " + e.getMessage());
@ -365,7 +402,7 @@ public class SendUtil {
GotifySettingVo gotifySettingVo = JSON.parseObject(senderModel.getJsonSetting(), GotifySettingVo.class); GotifySettingVo gotifySettingVo = JSON.parseObject(senderModel.getJsonSetting(), GotifySettingVo.class);
if (gotifySettingVo != null) { if (gotifySettingVo != null) {
try { try {
SenderGotifyMsg.sendMsg(logId, handError, gotifySettingVo, smsVo.getMobile(), smsVo.getSmsVoForSend(smsTemplate, regexReplace)); SenderGotifyMsg.sendMsg(logId, handError, emitter, gotifySettingVo, smsVo.getMobile(), smsVo.getSmsVoForSend(smsTemplate, regexReplace));
} catch (Exception e) { } catch (Exception e) {
LogUtil.updateLog(logId, 0, e.getMessage()); LogUtil.updateLog(logId, 0, e.getMessage());
Log.e(TAG, "senderSendMsg: gotify error " + e.getMessage()); Log.e(TAG, "senderSendMsg: gotify error " + e.getMessage());

@ -6,16 +6,13 @@ import android.util.Log;
import androidx.annotation.NonNull; import androidx.annotation.NonNull;
import com.idormy.sms.forwarder.utils.LogUtil; import com.idormy.sms.forwarder.utils.LogUtil;
import com.idormy.sms.forwarder.utils.SettingUtil;
import java.io.IOException; import java.io.IOException;
import java.net.URLEncoder; import java.net.URLEncoder;
import java.util.Objects; import java.util.Objects;
import java.util.concurrent.TimeUnit;
import java.util.regex.Matcher; import java.util.regex.Matcher;
import java.util.regex.Pattern; import java.util.regex.Pattern;
import io.reactivex.rxjava3.core.Observable;
import io.reactivex.rxjava3.core.ObservableEmitter; import io.reactivex.rxjava3.core.ObservableEmitter;
import okhttp3.Call; import okhttp3.Call;
import okhttp3.Callback; import okhttp3.Callback;
@ -23,12 +20,11 @@ import okhttp3.OkHttpClient;
import okhttp3.Request; import okhttp3.Request;
import okhttp3.Response; import okhttp3.Response;
@SuppressWarnings("ResultOfMethodCallIgnored")
public class SenderBarkMsg extends SenderBaseMsg { public class SenderBarkMsg extends SenderBaseMsg {
static final String TAG = "SenderBarkMsg"; static final String TAG = "SenderBarkMsg";
public static void sendMsg(final long logId, final Handler handError, String barkServer, String barkIcon, String from, String content, String groupName) throws Exception { public static void sendMsg(final long logId, final Handler handError, final ObservableEmitter<Object> emitter, String barkServer, String barkIcon, String from, String content, String groupName) throws Exception {
Log.i(TAG, "sendMsg barkServer:" + barkServer + " from:" + from + " content:" + content); Log.i(TAG, "sendMsg barkServer:" + barkServer + " from:" + from + " content:" + content);
if (barkServer == null || barkServer.isEmpty()) { if (barkServer == null || barkServer.isEmpty()) {
@ -59,49 +55,31 @@ public class SenderBarkMsg extends SenderBaseMsg {
final String requestUrl = barkServer; final String requestUrl = barkServer;
Log.i(TAG, "requestUrl:" + requestUrl); Log.i(TAG, "requestUrl:" + requestUrl);
Observable OkHttpClient client = new OkHttpClient();
.create((ObservableEmitter<Object> emitter) -> { final Request request = new Request.Builder().url(requestUrl).get().build();
Toast(handError, TAG, "开始请求接口..."); Call call = client.newCall(request);
call.enqueue(new Callback() {
OkHttpClient client = new OkHttpClient(); @Override
final Request request = new Request.Builder().url(requestUrl).get().build(); public void onFailure(@NonNull Call call, @NonNull final IOException e) {
Call call = client.newCall(request); LogUtil.updateLog(logId, 0, e.getMessage());
call.enqueue(new Callback() { Toast(handError, TAG, "发送失败:" + e.getMessage());
@Override if (emitter != null) emitter.onError(new Exception("RxJava 请求接口异常..."));
public void onFailure(@NonNull Call call, @NonNull final IOException e) { }
LogUtil.updateLog(logId, 0, e.getMessage());
Toast(handError, TAG, "发送失败:" + e.getMessage()); @Override
emitter.onError(new RuntimeException("请求接口异常...")); 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);
@Override Toast(handError, TAG, "发送状态:" + responseStr);
public void onResponse(@NonNull Call call, @NonNull Response response) throws IOException {
final String responseStr = Objects.requireNonNull(response.body()).string(); //TODO:粗略解析是否发送成功
Log.d(TAG, "Response" + response.code() + "" + responseStr); if (responseStr.contains("\"message\":\"success\"")) {
Toast(handError, TAG, "发送状态:" + responseStr); LogUtil.updateLog(logId, 2, responseStr);
} else {
//TODO:粗略解析是否发送成功 LogUtil.updateLog(logId, 0, responseStr);
if (responseStr.contains("\"message\":\"success\"")) { }
LogUtil.updateLog(logId, 2, responseStr); }
} else { });
LogUtil.updateLog(logId, 0, responseStr);
}
}
});
}).retryWhen((Observable<Throwable> 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);
} }

@ -20,4 +20,5 @@ public class SenderBaseMsg {
handError.sendMessage(msg); handError.sendMessage(msg);
} }
} }
}
}

@ -9,7 +9,6 @@ import androidx.annotation.NonNull;
import com.alibaba.fastjson.JSON; import com.alibaba.fastjson.JSON;
import com.idormy.sms.forwarder.utils.LogUtil; import com.idormy.sms.forwarder.utils.LogUtil;
import com.idormy.sms.forwarder.utils.SettingUtil;
import java.io.IOException; import java.io.IOException;
import java.net.URLEncoder; import java.net.URLEncoder;
@ -19,12 +18,10 @@ import java.util.HashMap;
import java.util.List; import java.util.List;
import java.util.Map; import java.util.Map;
import java.util.Objects; import java.util.Objects;
import java.util.concurrent.TimeUnit;
import javax.crypto.Mac; import javax.crypto.Mac;
import javax.crypto.spec.SecretKeySpec; import javax.crypto.spec.SecretKeySpec;
import io.reactivex.rxjava3.core.Observable;
import io.reactivex.rxjava3.core.ObservableEmitter; import io.reactivex.rxjava3.core.ObservableEmitter;
import okhttp3.Call; import okhttp3.Call;
import okhttp3.Callback; import okhttp3.Callback;
@ -34,12 +31,12 @@ import okhttp3.Request;
import okhttp3.RequestBody; import okhttp3.RequestBody;
import okhttp3.Response; import okhttp3.Response;
@SuppressWarnings({"ResultOfMethodCallIgnored", "rawtypes", "unchecked", "deprecation"}) @SuppressWarnings({"rawtypes", "unchecked", "deprecation"})
public class SenderDingdingMsg extends SenderBaseMsg { public class SenderDingdingMsg extends SenderBaseMsg {
static final String TAG = "SenderDingdingMsg"; 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 { public static void sendMsg(final long logId, final Handler handError, final ObservableEmitter<Object> emitter, 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); Log.i(TAG, "sendMsg token:" + token + " secret:" + secret + " atMobiles:" + atMobiles + " atAll:" + atAll + " content:" + content);
if (token == null || token.isEmpty()) { if (token == null || token.isEmpty()) {
@ -91,55 +88,38 @@ public class SenderDingdingMsg extends SenderBaseMsg {
final String requestMsg = JSON.toJSONString(textMsgMap); final String requestMsg = JSON.toJSONString(textMsgMap);
Log.i(TAG, "requestMsg:" + requestMsg); Log.i(TAG, "requestMsg:" + requestMsg);
Observable OkHttpClient client = new OkHttpClient();
.create((ObservableEmitter<Object> emitter) -> { RequestBody requestBody = RequestBody.create(MediaType.parse("application/json;charset=utf-8"), requestMsg);
Toast(handError, TAG, "开始请求接口...");
final Request request = new Request.Builder()
OkHttpClient client = new OkHttpClient(); .url(requestUrl)
RequestBody requestBody = RequestBody.create(MediaType.parse("application/json;charset=utf-8"), requestMsg); .addHeader("Content-Type", "application/json; charset=utf-8")
.post(requestBody)
final Request request = new Request.Builder() .build();
.url(requestUrl) Call call = client.newCall(request);
.addHeader("Content-Type", "application/json; charset=utf-8") call.enqueue(new Callback() {
.post(requestBody) @Override
.build(); public void onFailure(@NonNull Call call, @NonNull final IOException e) {
Call call = client.newCall(request); LogUtil.updateLog(logId, 0, e.getMessage());
call.enqueue(new Callback() { Toast(handError, TAG, "发送失败:" + e.getMessage());
@Override if (emitter != null) emitter.onError(new Exception("RxJava 请求接口异常..."));
public void onFailure(@NonNull Call call, @NonNull final IOException e) { }
LogUtil.updateLog(logId, 0, e.getMessage());
Toast(handError, TAG, "发送失败:" + e.getMessage()); @Override
emitter.onError(new RuntimeException("请求接口异常...")); 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);
@Override Toast(handError, TAG, "发送状态:" + responseStr);
public void onResponse(@NonNull Call call, @NonNull Response response) throws IOException {
final String responseStr = Objects.requireNonNull(response.body()).string(); //TODO:粗略解析是否发送成功
Log.d(TAG, "Response" + response.code() + "" + responseStr); if (responseStr.contains("\"errcode\":0")) {
Toast(handError, TAG, "发送状态:" + responseStr); LogUtil.updateLog(logId, 2, responseStr);
} else {
//TODO:粗略解析是否发送成功 LogUtil.updateLog(logId, 0, responseStr);
if (responseStr.contains("\"errcode\":0")) { }
LogUtil.updateLog(logId, 2, responseStr); }
} else { });
LogUtil.updateLog(logId, 0, responseStr);
}
}
});
}).retryWhen((Observable<Throwable> 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);
} }

@ -18,12 +18,10 @@ import java.util.HashMap;
import java.util.Locale; import java.util.Locale;
import java.util.Map; import java.util.Map;
import java.util.Objects; import java.util.Objects;
import java.util.concurrent.TimeUnit;
import javax.crypto.Mac; import javax.crypto.Mac;
import javax.crypto.spec.SecretKeySpec; import javax.crypto.spec.SecretKeySpec;
import io.reactivex.rxjava3.core.Observable;
import io.reactivex.rxjava3.core.ObservableEmitter; import io.reactivex.rxjava3.core.ObservableEmitter;
import okhttp3.Call; import okhttp3.Call;
import okhttp3.Callback; import okhttp3.Callback;
@ -33,6 +31,7 @@ import okhttp3.Request;
import okhttp3.RequestBody; import okhttp3.RequestBody;
import okhttp3.Response; import okhttp3.Response;
@SuppressWarnings({"rawtypes", "unchecked", "deprecation"})
public class SenderFeishuMsg extends SenderBaseMsg { public class SenderFeishuMsg extends SenderBaseMsg {
static final String TAG = "SenderFeishuMsg"; static final String TAG = "SenderFeishuMsg";
@ -90,8 +89,8 @@ public class SenderFeishuMsg extends SenderBaseMsg {
" }\n" + " }\n" +
"}"; "}";
@SuppressWarnings("rawtypes") //@SuppressWarnings("rawtypes")
public static void sendMsg(final long logId, final Handler handError, String webhook, String secret, String from, Date date, String content) throws Exception { public static void sendMsg(final long logId, final Handler handError, final ObservableEmitter<Object> emitter, String webhook, String secret, String from, Date date, String content) throws Exception {
Log.i(TAG, "sendMsg webhook:" + webhook + " secret:" + secret + " content:" + content); Log.i(TAG, "sendMsg webhook:" + webhook + " secret:" + secret + " content:" + content);
if (webhook == null || webhook.isEmpty()) { if (webhook == null || webhook.isEmpty()) {
@ -121,60 +120,42 @@ public class SenderFeishuMsg extends SenderBaseMsg {
textMsgMap.put("msg_type", "interactive"); textMsgMap.put("msg_type", "interactive");
textMsgMap.put("card", "${CARD_BODY}"); textMsgMap.put("card", "${CARD_BODY}");
final String requestUrl = webhook; Log.i(TAG, "requestUrl:" + webhook);
Log.i(TAG, "requestUrl:" + requestUrl);
final String requestMsg = JSON.toJSONString(textMsgMap).replace("\"${CARD_BODY}\"", buildMsg(from, date, content)); final String requestMsg = JSON.toJSONString(textMsgMap).replace("\"${CARD_BODY}\"", buildMsg(from, date, content));
Log.i(TAG, "requestMsg:" + requestMsg); Log.i(TAG, "requestMsg:" + requestMsg);
Observable OkHttpClient client = new OkHttpClient();
.create((ObservableEmitter<Object> emitter) -> { @SuppressWarnings("deprecation") RequestBody requestBody = RequestBody.create(MediaType.parse("application/json;charset=utf-8"), requestMsg);
Toast(handError, TAG, "开始请求接口...");
final Request request = new Request.Builder()
OkHttpClient client = new OkHttpClient(); .url(webhook)
@SuppressWarnings("deprecation") RequestBody requestBody = RequestBody.create(MediaType.parse("application/json;charset=utf-8"), requestMsg); .addHeader("Content-Type", "application/json; charset=utf-8")
.post(requestBody)
final Request request = new Request.Builder() .build();
.url(requestUrl) Call call = client.newCall(request);
.addHeader("Content-Type", "application/json; charset=utf-8") call.enqueue(new Callback() {
.post(requestBody) @Override
.build(); public void onFailure(@NonNull Call call, @NonNull final IOException e) {
Call call = client.newCall(request); LogUtil.updateLog(logId, 0, e.getMessage());
call.enqueue(new Callback() { Toast(handError, TAG, "发送失败:" + e.getMessage());
@Override if (emitter != null) emitter.onError(new Exception("RxJava 请求接口异常..."));
public void onFailure(@NonNull Call call, @NonNull final IOException e) { }
LogUtil.updateLog(logId, 0, e.getMessage());
Toast(handError, TAG, "发送失败:" + e.getMessage()); @Override
emitter.onError(new RuntimeException("请求接口异常...")); 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);
@Override Toast(handError, TAG, "发送状态:" + responseStr);
public void onResponse(@NonNull Call call, @NonNull Response response) throws IOException {
final String responseStr = Objects.requireNonNull(response.body()).string(); //TODO:粗略解析是否发送成功
Log.d(TAG, "Response" + response.code() + "" + responseStr); if (responseStr.contains("\"StatusCode\":0")) {
Toast(handError, TAG, "发送状态:" + responseStr); LogUtil.updateLog(logId, 2, responseStr);
} else {
//TODO:粗略解析是否发送成功 LogUtil.updateLog(logId, 0, responseStr);
if (responseStr.contains("\"StatusCode\":0")) { }
LogUtil.updateLog(logId, 2, responseStr); }
} else { });
LogUtil.updateLog(logId, 0, responseStr);
}
}
});
}).retryWhen((Observable<Throwable> 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);
} }
private static String buildMsg(String from, Date date, String content) { private static String buildMsg(String from, Date date, String content) {

@ -11,6 +11,7 @@ import com.idormy.sms.forwarder.utils.LogUtil;
import java.io.IOException; import java.io.IOException;
import java.util.Objects; import java.util.Objects;
import io.reactivex.rxjava3.core.ObservableEmitter;
import okhttp3.Call; import okhttp3.Call;
import okhttp3.Callback; import okhttp3.Callback;
import okhttp3.FormBody; import okhttp3.FormBody;
@ -23,7 +24,7 @@ public class SenderGotifyMsg extends SenderBaseMsg {
static final String TAG = "SenderGotifyMsg"; static final String TAG = "SenderGotifyMsg";
public static void sendMsg(final long logId, final Handler handError, GotifySettingVo gotifySettingVo, String title, String message) throws Exception { public static void sendMsg(final long logId, final Handler handError, final ObservableEmitter<Object> emitter, GotifySettingVo gotifySettingVo, String title, String message) throws Exception {
//具体消息内容 //具体消息内容
if (message == null || message.isEmpty()) return; if (message == null || message.isEmpty()) return;
@ -45,6 +46,7 @@ public class SenderGotifyMsg extends SenderBaseMsg {
public void onFailure(@NonNull Call call, @NonNull final IOException e) { public void onFailure(@NonNull Call call, @NonNull final IOException e) {
LogUtil.updateLog(logId, 0, e.getMessage()); LogUtil.updateLog(logId, 0, e.getMessage());
Toast(handError, TAG, "发送失败:" + e.getMessage()); Toast(handError, TAG, "发送失败:" + e.getMessage());
if (emitter != null) emitter.onError(new RuntimeException("RxJava 请求接口异常..."));
} }
@Override @Override

@ -3,88 +3,69 @@ package com.idormy.sms.forwarder.sender;
import android.os.Handler; import android.os.Handler;
import android.util.Log; import android.util.Log;
import com.idormy.sms.forwarder.MyApplication;
import com.idormy.sms.forwarder.utils.LogUtil; import com.idormy.sms.forwarder.utils.LogUtil;
import com.idormy.sms.forwarder.utils.SettingUtil;
import com.smailnet.emailkit.Draft; import com.smailnet.emailkit.Draft;
import com.smailnet.emailkit.EmailKit; import com.smailnet.emailkit.EmailKit;
import java.util.Arrays; import java.util.Arrays;
import java.util.HashSet; import java.util.HashSet;
import java.util.Set; import java.util.Set;
import java.util.concurrent.TimeUnit;
import io.reactivex.rxjava3.core.Observable;
import io.reactivex.rxjava3.core.ObservableEmitter; import io.reactivex.rxjava3.core.ObservableEmitter;
@SuppressWarnings("ResultOfMethodCallIgnored")
public class SenderMailMsg extends SenderBaseMsg { public class SenderMailMsg extends SenderBaseMsg {
private static final String TAG = "SenderMailMsg"; private static final String TAG = "SenderMailMsg";
public static void sendEmail(final long logId, final Handler handError, final String protocol, final String host, final String port, final boolean ssl, final String fromEmail, final String nickname, final String pwd, final String toAdd, final String title, final String content) { public static void sendEmail(final long logId, final Handler handError, final ObservableEmitter<Object> emitter, final String protocol, final String host, final String port, final boolean ssl, final String fromEmail, final String nickname, final String pwd, final String toAdd, final String title, final String content) {
Log.d(TAG, "sendEmail: protocol:" + protocol + " host:" + host + " port:" + port + " ssl:" + ssl + " fromEmail:" + fromEmail + " nickname:" + nickname + " pwd:" + pwd + " toAdd:" + toAdd); Log.d(TAG, "sendEmail: protocol:" + protocol + " host:" + host + " port:" + port + " ssl:" + ssl + " fromEmail:" + fromEmail + " nickname:" + nickname + " pwd:" + pwd + " toAdd:" + toAdd);
Observable try {
.create((ObservableEmitter<Object> emitter) -> { //初始化框架
Toast(handError, TAG, "开始请求接口..."); EmailKit.initialize(MyApplication.getContext());
try {
//初始化框架 //配置发件人邮件服务器参数
//EmailKit.initialize(this); EmailKit.Config config = new EmailKit.Config()
.setSMTP(host, Integer.parseInt(port), ssl) //设置SMTP服务器主机地址、端口和是否开启ssl
//配置发件人邮件服务器参数 .setAccount(fromEmail) //发件人邮箱
EmailKit.Config config = new EmailKit.Config() .setPassword(pwd); //密码或授权码
.setSMTP(host, Integer.parseInt(port), ssl) //设置SMTP服务器主机地址、端口和是否开启ssl
.setAccount(fromEmail) //发件人邮箱 //多个收件人邮箱
.setPassword(pwd); //密码或授权码 Set<String> toSet = new HashSet<>(Arrays.asList(toAdd.replace("", ",").split(",")));
//多个收件人邮箱 //设置一封草稿邮件
Set<String> toSet = new HashSet<>(Arrays.asList(toAdd.replace("", ",").split(","))); Draft draft = new Draft()
.setNickname(nickname) //发件人昵称
//设置一封草稿邮件 .setTo(toSet) //收件人邮箱
Draft draft = new Draft() .setSubject(title) //邮件主题
.setNickname(nickname) //发件人昵称 .setText(content); //邮件正文
.setTo(toSet) //收件人邮箱
.setSubject(title) //邮件主题 //使用SMTP服务发送邮件
.setText(content); //邮件正文 EmailKit.useSMTPService(config)
.send(draft, new EmailKit.GetSendCallback() {
//使用SMTP服务发送邮件 @Override
EmailKit.useSMTPService(config) public void onSuccess() {
.send(draft, new EmailKit.GetSendCallback() { LogUtil.updateLog(logId, 2, "发送成功");
@Override Toast(handError, TAG, "发送成功");
public void onSuccess() { }
LogUtil.updateLog(logId, 2, "发送成功");
Toast(handError, TAG, "发送成功"); @Override
} public void onFailure(String errMsg) {
LogUtil.updateLog(logId, 0, errMsg);
@Override Toast(handError, TAG, "发送失败,错误:" + errMsg);
public void onFailure(String errMsg) { }
LogUtil.updateLog(logId, 0, errMsg); });
Toast(handError, TAG, "发送失败,错误:" + errMsg);
} //销毁框架
}); EmailKit.destroy();
//销毁框架 } catch (Exception e) {
EmailKit.destroy(); LogUtil.updateLog(logId, 0, e.getMessage());
Log.e(TAG, e.getMessage(), e);
} catch (Exception e) { Toast(handError, TAG, "发送失败:" + e.getMessage());
LogUtil.updateLog(logId, 0, e.getMessage()); if (emitter != null) emitter.onError(new Exception("RxJava 请求接口异常..."));
Log.e(TAG, e.getMessage(), e); }
Toast(handError, TAG, "发送失败:" + e.getMessage());
emitter.onError(new RuntimeException("请求接口异常..."));
}
}).retryWhen((Observable<Throwable> 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);
} }
} }

@ -8,15 +8,12 @@ import androidx.annotation.NonNull;
import com.alibaba.fastjson.JSON; import com.alibaba.fastjson.JSON;
import com.idormy.sms.forwarder.model.vo.PushPlusSettingVo; import com.idormy.sms.forwarder.model.vo.PushPlusSettingVo;
import com.idormy.sms.forwarder.utils.LogUtil; import com.idormy.sms.forwarder.utils.LogUtil;
import com.idormy.sms.forwarder.utils.SettingUtil;
import java.io.IOException; import java.io.IOException;
import java.util.HashMap; import java.util.HashMap;
import java.util.Map; import java.util.Map;
import java.util.Objects; import java.util.Objects;
import java.util.concurrent.TimeUnit;
import io.reactivex.rxjava3.core.Observable;
import io.reactivex.rxjava3.core.ObservableEmitter; import io.reactivex.rxjava3.core.ObservableEmitter;
import okhttp3.Call; import okhttp3.Call;
import okhttp3.Callback; import okhttp3.Callback;
@ -26,12 +23,12 @@ import okhttp3.Request;
import okhttp3.RequestBody; import okhttp3.RequestBody;
import okhttp3.Response; import okhttp3.Response;
@SuppressWarnings({"ResultOfMethodCallIgnored", "rawtypes", "unchecked", "deprecation"}) @SuppressWarnings({"rawtypes", "unchecked", "deprecation"})
public class SenderPushPlusMsg extends SenderBaseMsg { public class SenderPushPlusMsg extends SenderBaseMsg {
static final String TAG = "SenderPushPlusMsg"; static final String TAG = "SenderPushPlusMsg";
public static void sendMsg(final long logId, final Handler handError, PushPlusSettingVo pushPlusSettingVo, String title, String content) throws Exception { public static void sendMsg(final long logId, final Handler handError, final ObservableEmitter<Object> emitter, PushPlusSettingVo pushPlusSettingVo, String title, String content) throws Exception {
//用户令牌 //用户令牌
String token = pushPlusSettingVo.getToken(); String token = pushPlusSettingVo.getToken();
@ -77,55 +74,38 @@ public class SenderPushPlusMsg extends SenderBaseMsg {
final String requestMsg = JSON.toJSONString(textMsgMap); final String requestMsg = JSON.toJSONString(textMsgMap);
Log.i(TAG, "requestMsg:" + requestMsg); Log.i(TAG, "requestMsg:" + requestMsg);
Observable OkHttpClient client = new OkHttpClient();
.create((ObservableEmitter<Object> emitter) -> { RequestBody requestBody = RequestBody.create(MediaType.parse("application/json;charset=utf-8"), requestMsg);
Toast(handError, TAG, "开始请求接口...");
final Request request = new Request.Builder()
OkHttpClient client = new OkHttpClient(); .url(requestUrl)
RequestBody requestBody = RequestBody.create(MediaType.parse("application/json;charset=utf-8"), requestMsg); .addHeader("Content-Type", "application/json; charset=utf-8")
.post(requestBody)
final Request request = new Request.Builder() .build();
.url(requestUrl) Call call = client.newCall(request);
.addHeader("Content-Type", "application/json; charset=utf-8") call.enqueue(new Callback() {
.post(requestBody) @Override
.build(); public void onFailure(@NonNull Call call, @NonNull final IOException e) {
Call call = client.newCall(request); LogUtil.updateLog(logId, 0, e.getMessage());
call.enqueue(new Callback() { Toast(handError, TAG, "发送失败:" + e.getMessage());
@Override if (emitter != null) emitter.onError(new Exception("RxJava 请求接口异常..."));
public void onFailure(@NonNull Call call, @NonNull final IOException e) { }
LogUtil.updateLog(logId, 0, e.getMessage());
Toast(handError, TAG, "发送失败:" + e.getMessage()); @Override
emitter.onError(new RuntimeException("请求接口异常...")); 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);
@Override Toast(handError, TAG, "发送状态:" + responseStr);
public void onResponse(@NonNull Call call, @NonNull Response response) throws IOException {
final String responseStr = Objects.requireNonNull(response.body()).string(); //TODO:粗略解析是否发送成功
Log.d(TAG, "Response" + response.code() + "" + responseStr); if (responseStr.contains("\"code\":200")) {
Toast(handError, TAG, "发送状态:" + responseStr); LogUtil.updateLog(logId, 2, responseStr);
} else {
//TODO:粗略解析是否发送成功 LogUtil.updateLog(logId, 0, responseStr);
if (responseStr.contains("\"code\":200")) { }
LogUtil.updateLog(logId, 2, responseStr); }
} else { });
LogUtil.updateLog(logId, 0, responseStr);
}
}
});
}).retryWhen((Observable<Throwable> 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);
} }
} }

@ -14,15 +14,12 @@ import com.alibaba.fastjson.JSONObject;
import com.idormy.sms.forwarder.model.SenderModel; import com.idormy.sms.forwarder.model.SenderModel;
import com.idormy.sms.forwarder.model.vo.QYWXAppSettingVo; import com.idormy.sms.forwarder.model.vo.QYWXAppSettingVo;
import com.idormy.sms.forwarder.utils.LogUtil; import com.idormy.sms.forwarder.utils.LogUtil;
import com.idormy.sms.forwarder.utils.SettingUtil;
import java.io.IOException; import java.io.IOException;
import java.util.HashMap; import java.util.HashMap;
import java.util.Map; import java.util.Map;
import java.util.Objects; import java.util.Objects;
import java.util.concurrent.TimeUnit;
import io.reactivex.rxjava3.core.Observable;
import io.reactivex.rxjava3.core.ObservableEmitter; import io.reactivex.rxjava3.core.ObservableEmitter;
import okhttp3.Call; import okhttp3.Call;
import okhttp3.Callback; import okhttp3.Callback;
@ -32,12 +29,12 @@ import okhttp3.Request;
import okhttp3.RequestBody; import okhttp3.RequestBody;
import okhttp3.Response; import okhttp3.Response;
@SuppressWarnings({"rawtypes", "unchecked", "deprecation", "ResultOfMethodCallIgnored"}) @SuppressWarnings({"rawtypes", "unchecked", "deprecation"})
public class SenderQyWxAppMsg extends SenderBaseMsg { public class SenderQyWxAppMsg extends SenderBaseMsg {
static final String TAG = "SenderQyWxAppMsg"; static final String TAG = "SenderQyWxAppMsg";
public static void sendMsg(final long logId, final Handler handError, final SenderModel senderModel, final QYWXAppSettingVo qYWXAppSettingVo, String content) throws Exception { public static void sendMsg(final long logId, final Handler handError, final ObservableEmitter<Object> emitter, final SenderModel senderModel, final QYWXAppSettingVo qYWXAppSettingVo, String content) throws Exception {
if (qYWXAppSettingVo == null) { if (qYWXAppSettingVo == null) {
Toast(handError, TAG, "参数错误"); Toast(handError, TAG, "参数错误");
@ -56,101 +53,82 @@ public class SenderQyWxAppMsg extends SenderBaseMsg {
return; return;
} }
Observable //TODO:获取有效access_token
.create((ObservableEmitter<Object> emitter) -> { String accessToken = qYWXAppSettingVo.getAccessToken();
Toast(handError, TAG, "开始请求接口..."); if (accessToken == null || accessToken.isEmpty()) {
//TODO:获取有效access_token String getTokenUrl = "https://qyapi.weixin.qq.com/cgi-bin/gettoken?";
String accessToken = qYWXAppSettingVo.getAccessToken(); getTokenUrl += "corpid=" + corpID;
if (accessToken == null || accessToken.isEmpty()) { getTokenUrl += "&corpsecret=" + secret;
Log.d(TAG, "getTokenUrl" + getTokenUrl);
String getTokenUrl = "https://qyapi.weixin.qq.com/cgi-bin/gettoken?";
getTokenUrl += "corpid=" + corpID; OkHttpClient client = new OkHttpClient();
getTokenUrl += "&corpsecret=" + secret; final Request request = new Request.Builder().url(getTokenUrl).get().build();
Log.d(TAG, "getTokenUrl" + getTokenUrl); Call call = client.newCall(request);
call.enqueue(new Callback() {
OkHttpClient client = new OkHttpClient(); @Override
final Request request = new Request.Builder().url(getTokenUrl).get().build(); public void onFailure(@NonNull Call call, @NonNull final IOException e) {
Call call = client.newCall(request); LogUtil.updateLog(logId, 0, e.getMessage());
call.enqueue(new Callback() { qYWXAppSettingVo.setAccessToken("");
@Override qYWXAppSettingVo.setExpiresIn(0L);
public void onFailure(@NonNull Call call, @NonNull final IOException e) { if (senderModel != null) {
LogUtil.updateLog(logId, 0, e.getMessage()); senderModel.setJsonSetting(JSON.toJSONString(qYWXAppSettingVo));
qYWXAppSettingVo.setAccessToken(""); SenderUtil.updateSender(senderModel);
qYWXAppSettingVo.setExpiresIn(0L); }
if (senderModel != null) { Log.d(TAG, "onFailure" + e.getMessage());
senderModel.setJsonSetting(JSON.toJSONString(qYWXAppSettingVo)); if (handError != null) {
SenderUtil.updateSender(senderModel); Message msg = new Message();
} msg.what = NOTIFY;
Log.d(TAG, "onFailure" + e.getMessage()); Bundle bundle = new Bundle();
if (handError != null) { bundle.putString("DATA", "获取access_token失败" + e.getMessage());
Message msg = new Message(); msg.setData(bundle);
msg.what = NOTIFY; handError.sendMessage(msg);
Bundle bundle = new Bundle();
bundle.putString("DATA", "获取access_token失败" + e.getMessage()); if (emitter != null) emitter.onError(new Exception("RxJava 请求接口异常..."));
msg.setData(bundle);
handError.sendMessage(msg);
emitter.onError(new RuntimeException("请求接口异常..."));
}
}
@Override
public void onResponse(@NonNull Call call, @NonNull Response response) throws IOException {
final String json = Objects.requireNonNull(response.body()).string();
Log.d(TAG, "Code" + response.code() + " Response: " + json);
JSONObject jsonObject = JSON.parseObject(json);
int errcode = jsonObject.getInteger("errcode");
if (errcode == 0) {
String access_token = jsonObject.getString("access_token");
long expires_in = System.currentTimeMillis() + (jsonObject.getInteger("expires_in") - 120) * 1000L; //提前2分钟过期
Log.d(TAG, "access_token" + access_token);
Log.d(TAG, "expires_in" + expires_in);
qYWXAppSettingVo.setAccessToken(access_token);
qYWXAppSettingVo.setExpiresIn(expires_in);
if (senderModel != null) {
senderModel.setJsonSetting(JSON.toJSONString(qYWXAppSettingVo));
SenderUtil.updateSender(senderModel);
}
sendTextMsg(emitter, logId, handError, agentID, toUser, content, access_token);
} else {
String errmsg = jsonObject.getString("errmsg");
LogUtil.updateLog(logId, 0, errmsg);
Log.d(TAG, "onFailure" + errmsg);
if (handError != null) {
Message msg = new Message();
msg.what = NOTIFY;
Bundle bundle = new Bundle();
bundle.putString("DATA", "获取access_token失败" + errmsg);
msg.setData(bundle);
handError.sendMessage(msg);
}
emitter.onError(new RuntimeException("请求接口异常..."));
}
}
});
} else {
sendTextMsg(emitter, logId, handError, agentID, toUser, content, accessToken);
} }
}
@Override
public void onResponse(@NonNull Call call, @NonNull Response response) throws IOException {
final String json = Objects.requireNonNull(response.body()).string();
Log.d(TAG, "Code" + response.code() + " Response: " + json);
JSONObject jsonObject = JSON.parseObject(json);
int errcode = jsonObject.getInteger("errcode");
if (errcode == 0) {
String access_token = jsonObject.getString("access_token");
long expires_in = System.currentTimeMillis() + (jsonObject.getInteger("expires_in") - 120) * 1000L; //提前2分钟过期
Log.d(TAG, "access_token" + access_token);
Log.d(TAG, "expires_in" + expires_in);
qYWXAppSettingVo.setAccessToken(access_token);
qYWXAppSettingVo.setExpiresIn(expires_in);
if (senderModel != null) {
senderModel.setJsonSetting(JSON.toJSONString(qYWXAppSettingVo));
SenderUtil.updateSender(senderModel);
}
sendTextMsg(emitter, logId, handError, agentID, toUser, content, access_token);
} else {
String errmsg = jsonObject.getString("errmsg");
LogUtil.updateLog(logId, 0, errmsg);
Log.d(TAG, "onFailure" + errmsg);
if (handError != null) {
Message msg = new Message();
msg.what = NOTIFY;
Bundle bundle = new Bundle();
bundle.putString("DATA", "获取access_token失败" + errmsg);
msg.setData(bundle);
handError.sendMessage(msg);
}
if (emitter != null) emitter.onError(new Exception("RxJava 请求接口异常..."));
}
}
}).retryWhen((Observable<Throwable> errorObservable) -> errorObservable });
.zipWith(Observable.just( } else {
SettingUtil.getRetryDelayTime(1), sendTextMsg(emitter, logId, handError, agentID, toUser, content, accessToken);
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);
} }
@ -186,7 +164,7 @@ public class SenderQyWxAppMsg extends SenderBaseMsg {
public void onFailure(@NonNull Call call, @NonNull final IOException e) { public void onFailure(@NonNull Call call, @NonNull final IOException e) {
LogUtil.updateLog(logId, 0, e.getMessage()); LogUtil.updateLog(logId, 0, e.getMessage());
Toast(handError, TAG, "发送失败:" + e.getMessage()); Toast(handError, TAG, "发送失败:" + e.getMessage());
emitter.onError(new RuntimeException("请求接口异常...")); if (emitter != null) emitter.onError(new Exception("RxJava 请求接口异常..."));
} }
@Override @Override

@ -7,15 +7,12 @@ import androidx.annotation.NonNull;
import com.alibaba.fastjson.JSON; import com.alibaba.fastjson.JSON;
import com.idormy.sms.forwarder.utils.LogUtil; import com.idormy.sms.forwarder.utils.LogUtil;
import com.idormy.sms.forwarder.utils.SettingUtil;
import java.io.IOException; import java.io.IOException;
import java.util.HashMap; import java.util.HashMap;
import java.util.Map; import java.util.Map;
import java.util.Objects; import java.util.Objects;
import java.util.concurrent.TimeUnit;
import io.reactivex.rxjava3.core.Observable;
import io.reactivex.rxjava3.core.ObservableEmitter; import io.reactivex.rxjava3.core.ObservableEmitter;
import okhttp3.Call; import okhttp3.Call;
import okhttp3.Callback; import okhttp3.Callback;
@ -25,12 +22,12 @@ import okhttp3.Request;
import okhttp3.RequestBody; import okhttp3.RequestBody;
import okhttp3.Response; import okhttp3.Response;
@SuppressWarnings({"rawtypes", "unchecked", "deprecation", "ResultOfMethodCallIgnored"}) @SuppressWarnings({"rawtypes", "unchecked", "deprecation"})
public class SenderQyWxGroupRobotMsg extends SenderBaseMsg { public class SenderQyWxGroupRobotMsg extends SenderBaseMsg {
static final String TAG = "SenderQyWxGroupRobotMsg"; static final String TAG = "SenderQyWxGroupRobotMsg";
public static void sendMsg(final long logId, final Handler handError, String webHook, String from, String content) throws Exception { public static void sendMsg(final long logId, final Handler handError, final ObservableEmitter<Object> emitter, String webHook, String from, String content) throws Exception {
Log.i(TAG, "sendMsg webHook:" + webHook + " from:" + from + " content:" + content); Log.i(TAG, "sendMsg webHook:" + webHook + " from:" + from + " content:" + content);
if (webHook == null || webHook.isEmpty()) { if (webHook == null || webHook.isEmpty()) {
@ -43,60 +40,42 @@ public class SenderQyWxGroupRobotMsg extends SenderBaseMsg {
textText.put("content", content); textText.put("content", content);
textMsgMap.put("text", textText); textMsgMap.put("text", textText);
final String requestUrl = webHook; Log.i(TAG, "requestUrl:" + webHook);
Log.i(TAG, "requestUrl:" + requestUrl);
final String requestMsg = JSON.toJSONString(textMsgMap); final String requestMsg = JSON.toJSONString(textMsgMap);
Log.i(TAG, "requestMsg:" + requestMsg); Log.i(TAG, "requestMsg:" + requestMsg);
Observable OkHttpClient client = new OkHttpClient();
.create((ObservableEmitter<Object> emitter) -> { RequestBody requestBody = RequestBody.create(MediaType.parse("application/json;charset=utf-8"), requestMsg);
Toast(handError, TAG, "开始请求接口...");
final Request request = new Request.Builder()
OkHttpClient client = new OkHttpClient(); .url(webHook)
RequestBody requestBody = RequestBody.create(MediaType.parse("application/json;charset=utf-8"), requestMsg); .addHeader("Content-Type", "application/json; charset=utf-8")
.post(requestBody)
final Request request = new Request.Builder() .build();
.url(requestUrl) Call call = client.newCall(request);
.addHeader("Content-Type", "application/json; charset=utf-8") call.enqueue(new Callback() {
.post(requestBody) @Override
.build(); public void onFailure(@NonNull Call call, @NonNull final IOException e) {
Call call = client.newCall(request); LogUtil.updateLog(logId, 0, e.getMessage());
call.enqueue(new Callback() { Toast(handError, TAG, "发送失败:" + e.getMessage());
@Override if (emitter != null) emitter.onError(new Exception("RxJava 请求接口异常..."));
public void onFailure(@NonNull Call call, @NonNull final IOException e) { }
LogUtil.updateLog(logId, 0, e.getMessage());
Toast(handError, TAG, "发送失败:" + e.getMessage()); @Override
emitter.onError(new RuntimeException("请求接口异常...")); 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);
@Override Toast(handError, TAG, "发送状态:" + responseStr);
public void onResponse(@NonNull Call call, @NonNull Response response) throws IOException {
final String responseStr = Objects.requireNonNull(response.body()).string(); //TODO:粗略解析是否发送成功
Log.d(TAG, "Response" + response.code() + "" + responseStr); if (responseStr.contains("\"errcode\":0")) {
Toast(handError, TAG, "发送状态:" + responseStr); LogUtil.updateLog(logId, 2, responseStr);
} else {
//TODO:粗略解析是否发送成功 LogUtil.updateLog(logId, 0, responseStr);
if (responseStr.contains("\"errcode\":0")) { }
LogUtil.updateLog(logId, 2, responseStr); }
} else { });
LogUtil.updateLog(logId, 0, responseStr);
}
}
});
}).retryWhen((Observable<Throwable> 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);
} }
} }

@ -6,13 +6,10 @@ import android.util.Log;
import androidx.annotation.NonNull; import androidx.annotation.NonNull;
import com.idormy.sms.forwarder.utils.LogUtil; import com.idormy.sms.forwarder.utils.LogUtil;
import com.idormy.sms.forwarder.utils.SettingUtil;
import java.io.IOException; import java.io.IOException;
import java.util.Objects; import java.util.Objects;
import java.util.concurrent.TimeUnit;
import io.reactivex.rxjava3.core.Observable;
import io.reactivex.rxjava3.core.ObservableEmitter; import io.reactivex.rxjava3.core.ObservableEmitter;
import okhttp3.Call; import okhttp3.Call;
import okhttp3.Callback; import okhttp3.Callback;
@ -22,12 +19,11 @@ import okhttp3.Request;
import okhttp3.RequestBody; import okhttp3.RequestBody;
import okhttp3.Response; import okhttp3.Response;
@SuppressWarnings("ResultOfMethodCallIgnored")
public class SenderServerChanMsg extends SenderBaseMsg { public class SenderServerChanMsg extends SenderBaseMsg {
static final String TAG = "SenderServerChanMsg"; static final String TAG = "SenderServerChanMsg";
public static void sendMsg(final long logId, final Handler handError, final String sendKey, final String title, final String desp) throws Exception { public static void sendMsg(final long logId, final Handler handError, final ObservableEmitter<Object> emitter, final String sendKey, final String title, final String desp) throws Exception {
Log.i(TAG, "sendMsg sendKey:" + sendKey + " title:" + title + " desp:" + desp); Log.i(TAG, "sendMsg sendKey:" + sendKey + " title:" + title + " desp:" + desp);
if (sendKey == null || sendKey.isEmpty()) { if (sendKey == null || sendKey.isEmpty()) {
@ -40,54 +36,37 @@ public class SenderServerChanMsg extends SenderBaseMsg {
final String requestMsg = desp.replaceFirst("^" + title + "(.*)", "").trim(); final String requestMsg = desp.replaceFirst("^" + title + "(.*)", "").trim();
Log.i(TAG, "requestMsg:" + requestMsg); Log.i(TAG, "requestMsg:" + requestMsg);
Observable OkHttpClient client = new OkHttpClient().newBuilder().build();
.create((ObservableEmitter<Object> emitter) -> { MultipartBody.Builder builder = new MultipartBody.Builder().setType(MultipartBody.FORM)
Toast(handError, TAG, "开始请求接口..."); .addFormDataPart("title", title)
.addFormDataPart("desp", requestMsg);
OkHttpClient client = new OkHttpClient().newBuilder().build();
MultipartBody.Builder builder = new MultipartBody.Builder().setType(MultipartBody.FORM) RequestBody body = builder.build();
.addFormDataPart("title", title) Request request = new Request.Builder().url(requestUrl).method("POST", body).build();
.addFormDataPart("desp", requestMsg); Call call = client.newCall(request);
call.enqueue(new Callback() {
RequestBody body = builder.build(); @Override
Request request = new Request.Builder().url(requestUrl).method("POST", body).build(); public void onFailure(@NonNull Call call, @NonNull final IOException e) {
Call call = client.newCall(request); LogUtil.updateLog(logId, 0, e.getMessage());
call.enqueue(new Callback() { Toast(handError, TAG, "发送失败:" + e.getMessage());
@Override if (emitter != null) emitter.onError(new Exception("RxJava 请求接口异常..."));
public void onFailure(@NonNull Call call, @NonNull final IOException e) { }
LogUtil.updateLog(logId, 0, e.getMessage());
Toast(handError, TAG, "发送失败:" + e.getMessage()); @Override
emitter.onError(new RuntimeException("请求接口异常...")); 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);
@Override Toast(handError, TAG, "发送状态:" + responseStr);
public void onResponse(@NonNull Call call, @NonNull Response response) throws IOException {
final String responseStr = Objects.requireNonNull(response.body()).string(); //TODO:粗略解析是否发送成功
Log.d(TAG, "Response" + response.code() + "" + responseStr); if (responseStr.contains("\"code\":0")) {
Toast(handError, TAG, "发送状态:" + responseStr); LogUtil.updateLog(logId, 2, responseStr);
} else {
//TODO:粗略解析是否发送成功 LogUtil.updateLog(logId, 0, responseStr);
if (responseStr.contains("\"code\":0")) { }
LogUtil.updateLog(logId, 2, responseStr); }
} else { });
LogUtil.updateLog(logId, 0, responseStr);
}
}
});
}).retryWhen((Observable<Throwable> 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);
} }
} }

@ -9,7 +9,6 @@ import androidx.annotation.NonNull;
import com.alibaba.fastjson.JSON; import com.alibaba.fastjson.JSON;
import com.idormy.sms.forwarder.model.vo.TelegramSettingVo; import com.idormy.sms.forwarder.model.vo.TelegramSettingVo;
import com.idormy.sms.forwarder.utils.LogUtil; import com.idormy.sms.forwarder.utils.LogUtil;
import com.idormy.sms.forwarder.utils.SettingUtil;
import java.io.IOException; import java.io.IOException;
import java.net.InetSocketAddress; import java.net.InetSocketAddress;
@ -19,7 +18,6 @@ import java.util.Map;
import java.util.Objects; import java.util.Objects;
import java.util.concurrent.TimeUnit; import java.util.concurrent.TimeUnit;
import io.reactivex.rxjava3.core.Observable;
import io.reactivex.rxjava3.core.ObservableEmitter; import io.reactivex.rxjava3.core.ObservableEmitter;
import okhttp3.Authenticator; import okhttp3.Authenticator;
import okhttp3.Call; import okhttp3.Call;
@ -32,12 +30,12 @@ import okhttp3.Request;
import okhttp3.RequestBody; import okhttp3.RequestBody;
import okhttp3.Response; import okhttp3.Response;
@SuppressWarnings({"rawtypes", "unchecked", "deprecation", "ResultOfMethodCallIgnored"}) @SuppressWarnings({"rawtypes", "unchecked", "deprecation"})
public class SenderTelegramMsg extends SenderBaseMsg { public class SenderTelegramMsg extends SenderBaseMsg {
static final String TAG = "SenderTelegramMsg"; static final String TAG = "SenderTelegramMsg";
public static void sendMsg(final long logId, final Handler handError, TelegramSettingVo telegramSettingVo, final String from, final String text, final String method) throws Exception { public static void sendMsg(final long logId, final Handler handError, final ObservableEmitter<Object> emitter, TelegramSettingVo telegramSettingVo, final String from, final String text, final String method) throws Exception {
Log.i(TAG, "sendMsg telegramSettingVo:" + telegramSettingVo.toString() + " text:" + text); Log.i(TAG, "sendMsg telegramSettingVo:" + telegramSettingVo.toString() + " text:" + text);
String apiToken = telegramSettingVo.getApiToken(); String apiToken = telegramSettingVo.getApiToken();
@ -64,106 +62,90 @@ public class SenderTelegramMsg extends SenderBaseMsg {
final String proxyUsername = telegramSettingVo.getProxyUsername(); final String proxyUsername = telegramSettingVo.getProxyUsername();
final String proxyPassword = telegramSettingVo.getProxyPassword(); final String proxyPassword = telegramSettingVo.getProxyPassword();
Observable try {
.create((ObservableEmitter<Object> emitter) -> { Proxy proxy = null;
Toast(handError, TAG, "开始请求接口..."); Authenticator proxyAuthenticator = null;
try { if ((proxyType == Proxy.Type.HTTP || proxyType == Proxy.Type.SOCKS) && !TextUtils.isEmpty(proxyHost) && !TextUtils.isEmpty(proxyPort)) {
Proxy proxy = null; proxy = new Proxy(proxyType, new InetSocketAddress(proxyHost, Integer.parseInt(proxyPort)));
Authenticator proxyAuthenticator = null;
if (needProxyAuthenticator && (!TextUtils.isEmpty(proxyUsername) || !TextUtils.isEmpty(proxyPassword))) {
if ((proxyType == Proxy.Type.HTTP || proxyType == Proxy.Type.SOCKS) && !TextUtils.isEmpty(proxyHost) && !TextUtils.isEmpty(proxyPort)) { proxyAuthenticator = (route, response) -> {
proxy = new Proxy(proxyType, new InetSocketAddress(proxyHost, Integer.parseInt(proxyPort))); String credential = Credentials.basic("jesse", "password1");
return response.request().newBuilder()
if (needProxyAuthenticator && (!TextUtils.isEmpty(proxyUsername) || !TextUtils.isEmpty(proxyPassword))) { .header("Authorization", credential)
proxyAuthenticator = (route, response) -> { .build();
String credential = Credentials.basic("jesse", "password1"); };
return response.request().newBuilder() }
.header("Authorization", credential) }
.build();
}; OkHttpClient client;
} if (proxy != null && proxyAuthenticator != null) {
} client = new OkHttpClient().newBuilder().proxy(proxy).proxyAuthenticator(proxyAuthenticator)
.connectTimeout(120, TimeUnit.SECONDS).readTimeout(120, TimeUnit.SECONDS)
OkHttpClient client; .connectionPool(new ConnectionPool(5, 1, TimeUnit.SECONDS)).build();
if (proxy != null && proxyAuthenticator != null) { } else if (proxy != null) {
client = new OkHttpClient().newBuilder().proxy(proxy).proxyAuthenticator(proxyAuthenticator) client = new OkHttpClient().newBuilder().proxy(proxy)
.connectTimeout(120, TimeUnit.SECONDS).readTimeout(120, TimeUnit.SECONDS) .connectTimeout(120, TimeUnit.SECONDS).readTimeout(120, TimeUnit.SECONDS)
.connectionPool(new ConnectionPool(5, 1, TimeUnit.SECONDS)).build(); .connectionPool(new ConnectionPool(5, 1, TimeUnit.SECONDS)).build();
} else if (proxy != null) { } else {
client = new OkHttpClient().newBuilder().proxy(proxy) client = new OkHttpClient().newBuilder()
.connectTimeout(120, TimeUnit.SECONDS).readTimeout(120, TimeUnit.SECONDS) .connectTimeout(120, TimeUnit.SECONDS).readTimeout(120, TimeUnit.SECONDS)
.connectionPool(new ConnectionPool(5, 1, TimeUnit.SECONDS)).build(); .connectionPool(new ConnectionPool(5, 1, TimeUnit.SECONDS)).build();
} else { }
client = new OkHttpClient().newBuilder()
.connectTimeout(120, TimeUnit.SECONDS).readTimeout(120, TimeUnit.SECONDS) final Request request;
.connectionPool(new ConnectionPool(5, 1, TimeUnit.SECONDS)).build(); if (method.equals("GET")) {
} request = new Request.Builder()
.url(requestUrl + "?chat_id=" + chatId + "&text=" + finalText)
final Request request; .build();
if (method.equals("GET")) { } else {
request = new Request.Builder() Map bodyMap = new HashMap();
.url(requestUrl + "?chat_id=" + chatId + "&text=" + finalText) bodyMap.put("chat_id", chatId);
.build(); bodyMap.put("text", finalText);
} else { bodyMap.put("parse_mode", "HTML");
Map bodyMap = new HashMap();
bodyMap.put("chat_id", chatId); String requestMsg = JSON.toJSONString(bodyMap);
bodyMap.put("text", finalText); Log.i(TAG, "requestMsg:" + requestMsg);
bodyMap.put("parse_mode", "HTML");
RequestBody requestBody = RequestBody.create(MediaType.parse("application/json;charset=utf-8"), requestMsg);
String requestMsg = JSON.toJSONString(bodyMap); request = new Request.Builder()
Log.i(TAG, "requestMsg:" + requestMsg); .url(requestUrl)
.addHeader("Content-Type", "application/json; charset=utf-8")
RequestBody requestBody = RequestBody.create(MediaType.parse("application/json;charset=utf-8"), requestMsg); .post(requestBody)
request = new Request.Builder() .build();
.url(requestUrl) }
.addHeader("Content-Type", "application/json; charset=utf-8")
.post(requestBody) client.newCall(request).enqueue(new Callback() {
.build(); @Override
} public void onFailure(@NonNull Call call, @NonNull final IOException e) {
LogUtil.updateLog(logId, 0, e.getMessage());
client.newCall(request).enqueue(new Callback() { Toast(handError, TAG, "发送失败:" + e.getMessage());
@Override if (emitter != null) emitter.onError(new Exception("RxJava 请求接口异常..."));
public void onFailure(@NonNull Call call, @NonNull final IOException e) { }
LogUtil.updateLog(logId, 0, e.getMessage());
Toast(handError, TAG, "发送失败:" + e.getMessage()); @Override
emitter.onError(new RuntimeException("请求接口异常...")); 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);
@Override Toast(handError, TAG, "发送状态:" + responseStr);
public void onResponse(@NonNull Call call, @NonNull Response response) throws IOException {
final String responseStr = Objects.requireNonNull(response.body()).string(); //TODO:粗略解析是否发送成功
Log.d(TAG, "Response" + response.code() + "" + responseStr); if (responseStr.contains("\"ok\":true")) {
Toast(handError, TAG, "发送状态:" + responseStr); LogUtil.updateLog(logId, 2, responseStr);
} else {
//TODO:粗略解析是否发送成功 LogUtil.updateLog(logId, 0, responseStr);
if (responseStr.contains("\"ok\":true")) {
LogUtil.updateLog(logId, 2, responseStr);
} else {
LogUtil.updateLog(logId, 0, responseStr);
}
}
});
} catch (Exception e) {
LogUtil.updateLog(logId, 0, e.getMessage());
Log.e(TAG, e.getMessage(), e);
Toast(handError, TAG, "发送失败:" + e.getMessage());
emitter.onError(new RuntimeException("请求接口异常..."));
} }
}).retryWhen((Observable<Throwable> errorObservable) -> errorObservable }
.zipWith(Observable.just( });
SettingUtil.getRetryDelayTime(1),
SettingUtil.getRetryDelayTime(2), } catch (Exception e) {
SettingUtil.getRetryDelayTime(3), LogUtil.updateLog(logId, 0, e.getMessage());
SettingUtil.getRetryDelayTime(4), Log.e(TAG, e.getMessage(), e);
SettingUtil.getRetryDelayTime(5) Toast(handError, TAG, "发送失败:" + e.getMessage());
), (Throwable e, Integer time) -> time) if (emitter != null) emitter.onError(new Exception("RxJava 请求接口异常..."));
.flatMap((Integer delay) -> { }
Toast(handError, TAG, "请求接口异常," + delay + "秒后重试");
return Observable.timer(delay, TimeUnit.SECONDS);
}))
.subscribe(System.out::println);
} }
} }

@ -8,18 +8,15 @@ import androidx.annotation.NonNull;
import com.idormy.sms.forwarder.utils.CertUtils; import com.idormy.sms.forwarder.utils.CertUtils;
import com.idormy.sms.forwarder.utils.LogUtil; import com.idormy.sms.forwarder.utils.LogUtil;
import com.idormy.sms.forwarder.utils.SettingUtil;
import java.io.IOException; import java.io.IOException;
import java.net.URLEncoder; import java.net.URLEncoder;
import java.nio.charset.StandardCharsets; import java.nio.charset.StandardCharsets;
import java.util.Objects; import java.util.Objects;
import java.util.concurrent.TimeUnit;
import javax.crypto.Mac; import javax.crypto.Mac;
import javax.crypto.spec.SecretKeySpec; import javax.crypto.spec.SecretKeySpec;
import io.reactivex.rxjava3.core.Observable;
import io.reactivex.rxjava3.core.ObservableEmitter; import io.reactivex.rxjava3.core.ObservableEmitter;
import okhttp3.Call; import okhttp3.Call;
import okhttp3.Callback; import okhttp3.Callback;
@ -30,12 +27,12 @@ import okhttp3.Request;
import okhttp3.RequestBody; import okhttp3.RequestBody;
import okhttp3.Response; import okhttp3.Response;
@SuppressWarnings({"deprecation", "ResultOfMethodCallIgnored"}) @SuppressWarnings({"deprecation"})
public class SenderWebNotifyMsg extends SenderBaseMsg { public class SenderWebNotifyMsg extends SenderBaseMsg {
static final String TAG = "SenderWebNotifyMsg"; static final String TAG = "SenderWebNotifyMsg";
public static void sendMsg(final long logId, final Handler handError, String webServer, String webParams, String secret, String method, String from, String content) throws Exception { public static void sendMsg(final long logId, final Handler handError, final ObservableEmitter<Object> emitter, String webServer, String webParams, String secret, String method, String from, String content) throws Exception {
Log.i(TAG, "sendMsg webServer:" + webServer + " webParams:" + webParams + " from:" + from + " content:" + content); Log.i(TAG, "sendMsg webServer:" + webServer + " webParams:" + webParams + " from:" + from + " content:" + content);
if (webServer == null || webServer.isEmpty()) { if (webServer == null || webServer.isEmpty()) {
@ -95,53 +92,35 @@ public class SenderWebNotifyMsg extends SenderBaseMsg {
request = new Request.Builder().url(webServer).method("POST", body).build(); request = new Request.Builder().url(webServer).method("POST", body).build();
} }
Observable OkHttpClient client = new OkHttpClient().newBuilder()
.create((ObservableEmitter<Object> emitter) -> { //忽略https证书
Toast(handError, TAG, "开始请求接口..."); .sslSocketFactory(CertUtils.getSSLSocketFactory(), CertUtils.getX509TrustManager())
.hostnameVerifier(CertUtils.getHostnameVerifier())
OkHttpClient client = new OkHttpClient().newBuilder() .build();
//忽略https证书 Call call = client.newCall(request);
.sslSocketFactory(CertUtils.getSSLSocketFactory(), CertUtils.getX509TrustManager()) call.enqueue(new Callback() {
.hostnameVerifier(CertUtils.getHostnameVerifier()) @Override
.build(); public void onFailure(@NonNull Call call, @NonNull final IOException e) {
Call call = client.newCall(request); LogUtil.updateLog(logId, 0, e.getMessage());
call.enqueue(new Callback() { Toast(handError, TAG, "发送失败:" + e.getMessage());
@Override if (emitter != null) emitter.onError(new Exception("RxJava 请求接口异常..."));
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);
//返回http状态200即为成功
if (200 == response.code()) {
LogUtil.updateLog(logId, 2, responseStr);
} else {
LogUtil.updateLog(logId, 0, responseStr);
}
}
});
}).retryWhen((Observable<Throwable> 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);
}
@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);
//返回http状态200即为成功
if (200 == response.code()) {
LogUtil.updateLog(logId, 2, responseStr);
} else {
LogUtil.updateLog(logId, 0, responseStr);
}
}
});
}
} }

@ -21,12 +21,8 @@ public class Define {
public static final String SP_MSG_KEY_STRING_BATTERY_LEVEL_CURRENT = "tsms_msg_key_string_battery_level_current"; public static final String SP_MSG_KEY_STRING_BATTERY_LEVEL_CURRENT = "tsms_msg_key_string_battery_level_current";
public static final String SP_MSG_KEY_STRING_BATTERY_LEVEL_ALARM = "tsms_msg_key_string_battery_level_alarm"; public static final String SP_MSG_KEY_STRING_BATTERY_LEVEL_ALARM = "tsms_msg_key_string_battery_level_alarm";
public static final String SP_MSG_KEY_STRING_BATTERY_LEVEL_MAX = "tsms_msg_key_string_battery_level_max"; public static final String SP_MSG_KEY_STRING_BATTERY_LEVEL_MAX = "tsms_msg_key_string_battery_level_max";
public static final String SP_MSG_KEY_STRING_ENABLE_RETRY_DELAY = "tsms_msg_key_switch_retry_delay"; public static final String SP_MSG_KEY_STRING_RETRY_TIMES = "tsms_msg_key_retry_times";
public static final String SP_MSG_KEY_STRING_RETRY_DELAY_TIME1 = "tsms_msg_key_string_retry_delay_time1"; public static final String SP_MSG_KEY_STRING_DELAY_TIME = "tsms_msg_key_delay_time";
public static final String SP_MSG_KEY_STRING_RETRY_DELAY_TIME2 = "tsms_msg_key_string_retry_delay_time2";
public static final String SP_MSG_KEY_STRING_RETRY_DELAY_TIME3 = "tsms_msg_key_string_retry_delay_time3";
public static final String SP_MSG_KEY_STRING_RETRY_DELAY_TIME4 = "tsms_msg_key_string_retry_delay_time4";
public static final String SP_MSG_KEY_STRING_RETRY_DELAY_TIME5 = "tsms_msg_key_string_retry_delay_time5";
public static final String SP_MSG_KEY_STRING_ENABLE_SMSHUB_API = "tsms_msg_key_string_enable_smshub_api"; public static final String SP_MSG_KEY_STRING_ENABLE_SMSHUB_API = "tsms_msg_key_string_enable_smshub_api";
public static final String SP_MSG_KEY_STRING_SMSHUB_API_URL = "tsms_msg_key_string_smshub_api_url"; public static final String SP_MSG_KEY_STRING_SMSHUB_API_URL = "tsms_msg_key_string_smshub_api_url";
public static final String SP_MSG_KEY_STRING_ENABLE_HTTP_SERVER = "tsms_msg_key_string_enable_http_server"; public static final String SP_MSG_KEY_STRING_ENABLE_HTTP_SERVER = "tsms_msg_key_string_enable_http_server";

@ -178,34 +178,6 @@ public class SettingUtil {
return !sp_setting.getBoolean("option_save_history_on", false); return !sp_setting.getBoolean("option_save_history_on", false);
} }
//接口请求失败重试
private static String getRetryDelayTimeKey(int index) {
switch (index) {
case 1:
return Define.SP_MSG_KEY_STRING_RETRY_DELAY_TIME1;
case 2:
return Define.SP_MSG_KEY_STRING_RETRY_DELAY_TIME2;
case 3:
return Define.SP_MSG_KEY_STRING_RETRY_DELAY_TIME3;
case 4:
return Define.SP_MSG_KEY_STRING_RETRY_DELAY_TIME4;
case 5:
default:
return Define.SP_MSG_KEY_STRING_RETRY_DELAY_TIME5;
}
}
public static int getRetryDelayTime(int index) {
String key = getRetryDelayTimeKey(index);
return sp_setting.getInt(key, (int) Math.pow(2, (index - 1)));
}
public static void setRetryDelayTime(int index, int retry_delay_time) {
String key = getRetryDelayTimeKey(index);
Log.d(TAG, "retry_delay_time_" + index + " :" + retry_delay_time);
sp_setting.edit().putInt(key, retry_delay_time).apply();
}
public static String getPrevNoticeHash(String key) { public static String getPrevNoticeHash(String key) {
return sp_setting.getString(key, ""); return sp_setting.getString(key, "");
} }
@ -238,14 +210,6 @@ public class SettingUtil {
return sp_setting.getString(Define.SP_MSG_KEY_STRING_SMSHUB_API_URL, "http://xxx.com/send_api"); return sp_setting.getString(Define.SP_MSG_KEY_STRING_SMSHUB_API_URL, "http://xxx.com/send_api");
} }
public static void switchRetryDelay(Boolean switchSmsTemplate) {
sp_setting.edit().putBoolean(Define.SP_MSG_KEY_STRING_ENABLE_RETRY_DELAY, switchSmsTemplate).apply();
}
public static boolean getSwitchRetryDelay() {
return sp_setting.getBoolean(Define.SP_MSG_KEY_STRING_ENABLE_RETRY_DELAY, false);
}
public static void switchCallType1(Boolean switchCallType) { public static void switchCallType1(Boolean switchCallType) {
sp_setting.edit().putBoolean(Define.SP_MSG_KEY_STRING_ENABLE_CALL_TYPE_1, switchCallType).apply(); sp_setting.edit().putBoolean(Define.SP_MSG_KEY_STRING_ENABLE_CALL_TYPE_1, switchCallType).apply();
} }
@ -270,6 +234,22 @@ public class SettingUtil {
return sp_setting.getBoolean(Define.SP_MSG_KEY_STRING_ENABLE_CALL_TYPE_3, true); return sp_setting.getBoolean(Define.SP_MSG_KEY_STRING_ENABLE_CALL_TYPE_3, true);
} }
public static int getRetryTimes() {
return sp_setting.getInt(Define.SP_MSG_KEY_STRING_RETRY_TIMES, 0);
}
public static void setRetryTimes(int retry_times) {
sp_setting.edit().putInt(Define.SP_MSG_KEY_STRING_RETRY_TIMES, retry_times).apply();
}
public static int getDelayTime() {
return sp_setting.getInt(Define.SP_MSG_KEY_STRING_DELAY_TIME, 1);
}
public static void setDelayTime(int delay_time) {
sp_setting.edit().putInt(Define.SP_MSG_KEY_STRING_DELAY_TIME, delay_time).apply();
}
//获取当前版本名称 //获取当前版本名称
public static String getVersionName() { public static String getVersionName() {
// 获取PackageManager的实例 // 获取PackageManager的实例

@ -657,95 +657,56 @@
tools:ignore="SmallSp" /> tools:ignore="SmallSp" />
</LinearLayout> </LinearLayout>
<LinearLayout <TextView
android:layout_width="wrap_content" android:layout_width="wrap_content"
android:layout_height="wrap_content" android:layout_height="wrap_content"
android:orientation="horizontal"> android:layout_marginStart="20dp"
android:text="@string/retry"
android:textStyle="bold" />
<EditText <EditText
android:id="@+id/et_retry_delay_time1" android:id="@+id/et_retry_times"
android:layout_width="30dp" android:layout_width="wrap_content"
android:layout_height="36dp" android:layout_height="wrap_content"
android:layout_marginStart="3dp" android:autofillHints=""
android:autofillHints="" android:ems="2"
android:digits="0123456789" android:inputType="number"
android:inputType="number" android:maxLines="1"
android:maxLength="3" android:text="@string/_0"
android:maxLines="1" android:textAlignment="center"
android:text="" tools:ignore="LabelFor" />
android:textAlignment="center"
android:textSize="12sp"
tools:ignore="LabelFor" />
<EditText
android:id="@+id/et_retry_delay_time2"
android:layout_width="30dp"
android:layout_height="36dp"
android:layout_marginStart="3dp"
android:autofillHints=""
android:digits="0123456789"
android:inputType="number"
android:maxLength="3"
android:maxLines="1"
android:text=""
android:textAlignment="center"
android:textSize="12sp"
tools:ignore="LabelFor" />
<EditText
android:id="@+id/et_retry_delay_time3"
android:layout_width="30dp"
android:layout_height="36dp"
android:layout_marginStart="3dp"
android:autofillHints=""
android:digits="0123456789"
android:inputType="number"
android:maxLength="3"
android:maxLines="1"
android:text=""
android:textAlignment="center"
android:textSize="12sp"
tools:ignore="LabelFor" />
<EditText
android:id="@+id/et_retry_delay_time4"
android:layout_width="30dp"
android:layout_height="36dp"
android:layout_marginStart="3dp"
android:autofillHints=""
android:digits="0123456789"
android:inputType="number"
android:maxLength="3"
android:maxLines="1"
android:text=""
android:textAlignment="center"
android:textSize="12sp"
tools:ignore="LabelFor" />
<EditText
android:id="@+id/et_retry_delay_time5"
android:layout_width="30dp"
android:layout_height="36dp"
android:layout_marginStart="3dp"
android:autofillHints=""
android:digits="0123456789"
android:inputType="number"
android:maxLength="3"
android:maxLines="1"
android:text=""
android:textAlignment="center"
android:textSize="12sp"
tools:ignore="LabelFor" />
</LinearLayout>
<Switch <TextView
android:id="@+id/switch_retry_delay" android:layout_width="wrap_content"
android:layout_width="0dp"
android:layout_height="wrap_content" android:layout_height="wrap_content"
android:layout_weight="1" android:text="@string/times"
android:gravity="end" android:textStyle="bold" />
android:textSize="16sp"
tools:ignore="UseSwitchCompatOrMaterialXml" /> <TextView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_marginStart="15dp"
android:text="@string/interval"
android:textStyle="bold" />
<EditText
android:id="@+id/et_delay_time"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:autofillHints=""
android:ems="2"
android:inputType="number"
android:maxLines="1"
android:text="@string/_1"
android:textAlignment="center"
tools:ignore="LabelFor" />
<TextView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="@string/seconds"
android:textStyle="bold" />
</LinearLayout> </LinearLayout>
<LinearLayout <LinearLayout

@ -100,8 +100,6 @@
<string name="setpushplustitle">PushPlus Settings</string> <string name="setpushplustitle">PushPlus Settings</string>
<string name="setgotifytitle">Gotify Settings</string> <string name="setgotifytitle">Gotify Settings</string>
<string name="test_phone_num">19999999999</string> <string name="test_phone_num">19999999999</string>
<string name="test_content">Test content @</string>
<string name="test_sms">【JD】code 387481, ihelp.jd.com</string>
<string name="test_group_name">Test Group Name</string> <string name="test_group_name">Test Group Name</string>
<string name="failed_to_fwd">Failed to fwd</string> <string name="failed_to_fwd">Failed to fwd</string>
<string name="invalid_name">Sender name cannot be blank</string> <string name="invalid_name">Sender name cannot be blank</string>
@ -174,7 +172,7 @@
<string name="low_power_alarm_threshold">Low power alarm threshold</string> <string name="low_power_alarm_threshold">Low power alarm threshold</string>
<string name="low_power_alarm_threshold_tips">Value range: 0100. Left blank or 0 is disabled</string> <string name="low_power_alarm_threshold_tips">Value range: 0100. Left blank or 0 is disabled</string>
<string name="retry_interval">Retry interval (seconds)</string> <string name="retry_interval">Retry interval (seconds)</string>
<string name="retry_interval_tips">Retry five times after it fails</string> <string name="retry_interval_tips">Disabled when times = 0, the interval is incremented</string>
<string name="forward_sms">Forward sms</string> <string name="forward_sms">Forward sms</string>
<string name="forward_sms_tips">Main switch, requires permissions to read and sned SMS messages, especially verification SMS texts.</string> <string name="forward_sms_tips">Main switch, requires permissions to read and sned SMS messages, especially verification SMS texts.</string>
<string name="forward_missed_calls">Forward calls log</string> <string name="forward_missed_calls">Forward calls log</string>
@ -302,6 +300,7 @@
<string name="feishu">FeiShu Bot</string> <string name="feishu">FeiShu Bot</string>
<string name="pushplus">PushPlus</string> <string name="pushplus">PushPlus</string>
<string name="gotify">Gotify</string> <string name="gotify">Gotify</string>
<string name="_0">0</string>
<string name="_1">1</string> <string name="_1">1</string>
<string name="_2">2</string> <string name="_2">2</string>
<string name="_3">3</string> <string name="_3">3</string>
@ -329,4 +328,10 @@
<string name="keep_alive_tips">It is recommended to open each authorization or setting, do not disable the notification bar, to avoid the APP service being killed</string> <string name="keep_alive_tips">It is recommended to open each authorization or setting, do not disable the notification bar, to avoid the APP service being killed</string>
<string name="custom_settings">Custom settings</string> <string name="custom_settings">Custom settings</string>
<string name="custom_settings_tips">If the automatic acquisition fails, please fill in the remarks manually; after clearing, it will be automatically acquired again!</string> <string name="custom_settings_tips">If the automatic acquisition fails, please fill in the remarks manually; after clearing, it will be automatically acquired again!</string>
<string name="times">times</string>
<string name="interval">Interval</string>
<string name="seconds">seconds</string>
<string name="retry">Retry</string>
<string name="test_sender_sms">[Test Channel] Congratulations, the sending channel test is successful, please continue to add forwarding rules!</string>
<string name="test_sim_info" tools:ignore="Typos">SIM1_TestOperator_18888888888</string>
</resources> </resources>

@ -100,8 +100,6 @@
<string name="setpushplustitle">设置PushPlus</string> <string name="setpushplustitle">设置PushPlus</string>
<string name="setgotifytitle">设置Gotify</string> <string name="setgotifytitle">设置Gotify</string>
<string name="test_phone_num">19999999999</string> <string name="test_phone_num">19999999999</string>
<string name="test_content">测试内容(content)@</string>
<string name="test_sms">【京东】验证码为387481切勿将验证码告知他人请在页面中输入完成验证如有问题请点击 ihelp.jd.com 联系京东客服</string>
<string name="test_group_name">测试分组</string> <string name="test_group_name">测试分组</string>
<string name="failed_to_fwd">发送失败:</string> <string name="failed_to_fwd">发送失败:</string>
<string name="invalid_name">通道名称不能为空</string> <string name="invalid_name">通道名称不能为空</string>
@ -173,8 +171,8 @@
<string name="carrier_mobile">运营商_手机号</string> <string name="carrier_mobile">运营商_手机号</string>
<string name="low_power_alarm_threshold">电量预警阈值(%)</string> <string name="low_power_alarm_threshold">电量预警阈值(%)</string>
<string name="low_power_alarm_threshold_tips">取值范围01000禁用</string> <string name="low_power_alarm_threshold_tips">取值范围01000禁用</string>
<string name="retry_interval">失败重试间隔(秒)</string> <string name="retry_interval">请求接口失败重试</string>
<string name="retry_interval_tips">接口请求失败后将重试5</string> <string name="retry_interval_tips">数=0时禁用间隔逐次递增</string>
<string name="forward_sms">转发短信广播</string> <string name="forward_sms">转发短信广播</string>
<string name="forward_sms_tips">总开关,请授予读取短信、通知类短信、发送短信等权限</string> <string name="forward_sms_tips">总开关,请授予读取短信、通知类短信、发送短信等权限</string>
<string name="forward_missed_calls">转发通话记录</string> <string name="forward_missed_calls">转发通话记录</string>
@ -301,6 +299,7 @@
<string name="feishu">飞书机器人</string> <string name="feishu">飞书机器人</string>
<string name="pushplus">PushPlus</string> <string name="pushplus">PushPlus</string>
<string name="gotify">Gotify</string> <string name="gotify">Gotify</string>
<string name="_0">0</string>
<string name="_1">1</string> <string name="_1">1</string>
<string name="_2">2</string> <string name="_2">2</string>
<string name="_3">3</string> <string name="_3">3</string>
@ -328,4 +327,10 @@
<string name="keep_alive_tips">建议开启每一项授权或设置不要禁用通知栏避免APP服务被杀</string> <string name="keep_alive_tips">建议开启每一项授权或设置不要禁用通知栏避免APP服务被杀</string>
<string name="custom_settings">个性设置</string> <string name="custom_settings">个性设置</string>
<string name="custom_settings_tips">如果自动获取失败,请手动填写备注信息;清空后将再次自动获取!</string> <string name="custom_settings_tips">如果自动获取失败,请手动填写备注信息;清空后将再次自动获取!</string>
<string name="times"></string>
<string name="interval">间隔</string>
<string name="seconds"></string>
<string name="retry">重试</string>
<string name="test_sender_sms">【测试通道】恭喜您,该发送通道测试成功,请继续添加转发规则!</string>
<string name="test_sim_info" tools:ignore="Typos">SIM1_测试运营商_18888888888</string>
</resources> </resources>

Loading…
Cancel
Save