diff --git a/app/src/main/java/com/idormy/sms/forwarder/SenderActivity.java b/app/src/main/java/com/idormy/sms/forwarder/SenderActivity.java index 9a0103a3..698be1d1 100644 --- a/app/src/main/java/com/idormy/sms/forwarder/SenderActivity.java +++ b/app/src/main/java/com/idormy/sms/forwarder/SenderActivity.java @@ -5,6 +5,7 @@ import static com.idormy.sms.forwarder.model.SenderModel.TYPE_BARK; import static com.idormy.sms.forwarder.model.SenderModel.TYPE_DINGDING; import static com.idormy.sms.forwarder.model.SenderModel.TYPE_EMAIL; import static com.idormy.sms.forwarder.model.SenderModel.TYPE_FEISHU; +import static com.idormy.sms.forwarder.model.SenderModel.TYPE_GOTIFY; import static com.idormy.sms.forwarder.model.SenderModel.TYPE_PUSHPLUS; import static com.idormy.sms.forwarder.model.SenderModel.TYPE_QYWX_APP; import static com.idormy.sms.forwarder.model.SenderModel.TYPE_QYWX_GROUP_ROBOT; @@ -38,6 +39,7 @@ import com.idormy.sms.forwarder.model.vo.BarkSettingVo; import com.idormy.sms.forwarder.model.vo.DingDingSettingVo; import com.idormy.sms.forwarder.model.vo.EmailSettingVo; import com.idormy.sms.forwarder.model.vo.FeiShuSettingVo; +import com.idormy.sms.forwarder.model.vo.GotifySettingVo; import com.idormy.sms.forwarder.model.vo.PushPlusSettingVo; import com.idormy.sms.forwarder.model.vo.QYWXAppSettingVo; import com.idormy.sms.forwarder.model.vo.QYWXGroupRobotSettingVo; @@ -48,6 +50,7 @@ import com.idormy.sms.forwarder.model.vo.WebNotifySettingVo; import com.idormy.sms.forwarder.sender.SenderBarkMsg; import com.idormy.sms.forwarder.sender.SenderDingdingMsg; import com.idormy.sms.forwarder.sender.SenderFeishuMsg; +import com.idormy.sms.forwarder.sender.SenderGotifyMsg; import com.idormy.sms.forwarder.sender.SenderMailMsg; import com.idormy.sms.forwarder.sender.SenderPushPlusMsg; import com.idormy.sms.forwarder.sender.SenderQyWxAppMsg; @@ -149,6 +152,9 @@ public class SenderActivity extends AppCompatActivity { case TYPE_PUSHPLUS: setPushPlus(senderModel, false); break; + case TYPE_GOTIFY: + setGotify(senderModel, false); + break; default: Toast.makeText(SenderActivity.this, R.string.invalid_sender, Toast.LENGTH_LONG).show(); SenderUtil.delSender(senderModel.getId()); @@ -209,6 +215,9 @@ public class SenderActivity extends AppCompatActivity { case TYPE_PUSHPLUS: setPushPlus(senderModel, true); break; + case TYPE_GOTIFY: + setGotify(senderModel, true); + break; default: Toast.makeText(SenderActivity.this, R.string.invalid_sender, Toast.LENGTH_LONG).show(); SenderUtil.delSender(senderModel.getId()); @@ -272,6 +281,9 @@ public class SenderActivity extends AppCompatActivity { case TYPE_PUSHPLUS: setPushPlus(null, false); break; + case TYPE_GOTIFY: + setGotify(null, false); + break; default: Toast.makeText(SenderActivity.this, R.string.not_supported, Toast.LENGTH_LONG).show(); break; @@ -1472,6 +1484,140 @@ public class SenderActivity extends AppCompatActivity { }); } + //Gotify + @SuppressLint("SimpleDateFormat") + private void setGotify(final SenderModel senderModel, final boolean isClone) { + GotifySettingVo gotifySettingVo = null; + //try phrase json setting + if (senderModel != null) { + String jsonSettingStr = senderModel.getJsonSetting(); + if (jsonSettingStr != null) { + gotifySettingVo = JSON.parseObject(jsonSettingStr, GotifySettingVo.class); + } + } + + final AlertDialog.Builder alertDialog71 = new AlertDialog.Builder(SenderActivity.this); + View view1 = View.inflate(SenderActivity.this, R.layout.alert_dialog_setview_gotify, null); + + final EditText editTextGotifyName = view1.findViewById(R.id.editTextGotifyName); + if (senderModel != null) editTextGotifyName.setText(senderModel.getName()); + + final EditText editTextGotifyWebServer = view1.findViewById(R.id.editTextGotifyWebServer); + final EditText editTextGotifyTitle = view1.findViewById(R.id.editTextGotifyTitle); + final EditText editTextGotifyPriority = view1.findViewById(R.id.editTextGotifyPriority); + if (gotifySettingVo != null) { + editTextGotifyWebServer.setText(gotifySettingVo.getWebServer()); + editTextGotifyTitle.setText(gotifySettingVo.getTitle()); + editTextGotifyPriority.setText(gotifySettingVo.getPriority()); + } + + Button buttonGotifyOk = view1.findViewById(R.id.buttonGotifyOk); + Button buttonGotifyDel = view1.findViewById(R.id.buttonGotifyDel); + Button buttonGotifyTest = view1.findViewById(R.id.buttonGotifyTest); + alertDialog71 + .setTitle(R.string.setgotifytitle) + .setIcon(R.mipmap.gotify) + .setView(view1) + .create(); + final AlertDialog show = alertDialog71.show(); + + buttonGotifyOk.setOnClickListener(view -> { + String webServer = editTextGotifyWebServer.getText().toString().trim(); + if (webServer.isEmpty()) { + Toast.makeText(SenderActivity.this, R.string.invalid_webserver, Toast.LENGTH_LONG).show(); + return; + } + + String title = editTextGotifyTitle.getText().toString().trim(); + if (title.isEmpty()) title = "SmsForwarder Title"; + + String priority = editTextGotifyPriority.getText().toString().trim(); + + GotifySettingVo gotifySettingVoNew = new GotifySettingVo(webServer, title, priority); + + if (isClone || senderModel == null) { + SenderModel newSenderModel = new SenderModel(); + newSenderModel.setName(editTextGotifyName.getText().toString().trim()); + newSenderModel.setType(TYPE_GOTIFY); + newSenderModel.setStatus(STATUS_ON); + newSenderModel.setJsonSetting(JSON.toJSONString(gotifySettingVoNew)); + SenderUtil.addSender(newSenderModel); + initSenders(); + adapter.add(senderModels); + } else { + senderModel.setName(editTextGotifyName.getText().toString().trim()); + senderModel.setType(TYPE_GOTIFY); + senderModel.setStatus(STATUS_ON); + senderModel.setJsonSetting(JSON.toJSONString(gotifySettingVoNew)); + SenderUtil.updateSender(senderModel); + initSenders(); + adapter.update(senderModels); + } + + show.dismiss(); + }); + buttonGotifyDel.setOnClickListener(view -> { + if (senderModel != null) { + SenderUtil.delSender(senderModel.getId()); + initSenders(); + adapter.del(senderModels); + } + show.dismiss(); + }); + buttonGotifyTest.setOnClickListener(view -> { + String webServer = editTextGotifyWebServer.getText().toString().trim(); + if (webServer.isEmpty()) { + Toast.makeText(SenderActivity.this, R.string.invalid_webserver, Toast.LENGTH_LONG).show(); + return; + } + + String title = editTextGotifyTitle.getText().toString().trim(); + if (title.isEmpty()) title = "SmsForwarder Title"; + + String priority = editTextGotifyPriority.getText().toString().trim(); + + GotifySettingVo gotifySettingVoNew = new GotifySettingVo(webServer, title, priority); + + try { + SenderGotifyMsg.sendMsg(0, handler, gotifySettingVoNew, title, R.string.test_content + (new SimpleDateFormat("yyyy-MM-dd HH:mm:ss").format(new Date()))); + } catch (Exception e) { + Toast.makeText(SenderActivity.this, getString(R.string.failed_to_fwd) + e.getMessage(), Toast.LENGTH_LONG).show(); + e.printStackTrace(); + } + + }); + + + Button buttonInsertSender = view1.findViewById(R.id.bt_insert_sender); + buttonInsertSender.setOnClickListener(view -> { + editTextGotifyTitle.setFocusable(true); + editTextGotifyTitle.requestFocus(); + editTextGotifyTitle.append("{{来源号码}}"); + }); + + Button buttonInsertExtra = view1.findViewById(R.id.bt_insert_extra); + buttonInsertExtra.setOnClickListener(view -> { + editTextGotifyTitle.setFocusable(true); + editTextGotifyTitle.requestFocus(); + editTextGotifyTitle.append("{{卡槽信息}}"); + }); + + Button buttonInsertTime = view1.findViewById(R.id.bt_insert_time); + buttonInsertTime.setOnClickListener(view -> { + editTextGotifyTitle.setFocusable(true); + editTextGotifyTitle.requestFocus(); + editTextGotifyTitle.append("{{接收时间}}"); + }); + + Button buttonInsertDeviceName = view1.findViewById(R.id.bt_insert_device_name); + buttonInsertDeviceName.setOnClickListener(view -> { + editTextGotifyTitle.setFocusable(true); + editTextGotifyTitle.requestFocus(); + editTextGotifyTitle.append("{{设备名称}}"); + }); + + } + @Override protected void onDestroy() { Log.d(TAG, "onDestroy"); diff --git a/app/src/main/java/com/idormy/sms/forwarder/model/SenderModel.java b/app/src/main/java/com/idormy/sms/forwarder/model/SenderModel.java index baa3673d..da0e38ae 100644 --- a/app/src/main/java/com/idormy/sms/forwarder/model/SenderModel.java +++ b/app/src/main/java/com/idormy/sms/forwarder/model/SenderModel.java @@ -22,6 +22,7 @@ public class SenderModel { public static final int TYPE_SMS = 8; public static final int TYPE_FEISHU = 9; public static final int TYPE_PUSHPLUS = 10; + public static final int TYPE_GOTIFY = 11; private Long id; private String name; private int status; @@ -61,6 +62,8 @@ public class SenderModel { return R.mipmap.feishu; case (TYPE_PUSHPLUS): return R.mipmap.pushplus; + case (TYPE_GOTIFY): + return R.mipmap.gotify; case (TYPE_SMS): default: return R.mipmap.sms; @@ -89,6 +92,8 @@ public class SenderModel { return R.mipmap.feishu; case (TYPE_PUSHPLUS): return R.mipmap.pushplus; + case (TYPE_GOTIFY): + return R.mipmap.gotify; case (TYPE_SMS): default: return R.mipmap.sms; diff --git a/app/src/main/java/com/idormy/sms/forwarder/model/vo/GotifySettingVo.java b/app/src/main/java/com/idormy/sms/forwarder/model/vo/GotifySettingVo.java new file mode 100644 index 00000000..6a980bdd --- /dev/null +++ b/app/src/main/java/com/idormy/sms/forwarder/model/vo/GotifySettingVo.java @@ -0,0 +1,22 @@ +package com.idormy.sms.forwarder.model.vo; + +import java.io.Serializable; + +import lombok.Data; + +@Data +public class GotifySettingVo implements Serializable { + private String webServer; + private String title; + private String priority; + + public GotifySettingVo() { + } + + public GotifySettingVo(String webServer, String title, String priority) { + this.webServer = webServer; + this.title = title; + this.priority = priority; + } + +} diff --git a/app/src/main/java/com/idormy/sms/forwarder/sender/SenderGotifyMsg.java b/app/src/main/java/com/idormy/sms/forwarder/sender/SenderGotifyMsg.java new file mode 100644 index 00000000..6ba251e8 --- /dev/null +++ b/app/src/main/java/com/idormy/sms/forwarder/sender/SenderGotifyMsg.java @@ -0,0 +1,94 @@ +package com.idormy.sms.forwarder.sender; + +import android.os.Handler; +import android.util.Log; + +import androidx.annotation.NonNull; + +import com.idormy.sms.forwarder.model.vo.GotifySettingVo; +import com.idormy.sms.forwarder.utils.LogUtil; +import com.idormy.sms.forwarder.utils.SettingUtil; + +import java.io.IOException; +import java.util.Objects; +import java.util.concurrent.TimeUnit; + +import io.reactivex.rxjava3.core.Observable; +import io.reactivex.rxjava3.core.ObservableEmitter; +import okhttp3.Call; +import okhttp3.Callback; +import okhttp3.FormBody; +import okhttp3.OkHttpClient; +import okhttp3.Request; +import okhttp3.RequestBody; +import okhttp3.Response; + +@SuppressWarnings({"ResultOfMethodCallIgnored", "rawtypes", "unchecked", "deprecation"}) +public class SenderGotifyMsg extends SenderBaseMsg { + + static final String TAG = "SenderGotifyMsg"; + + public static void sendMsg(final long logId, final Handler handError, GotifySettingVo gotifySettingVo, String title, String message) throws Exception { + + //具体消息内容 + if (message == null || message.isEmpty()) return; + + final RequestBody formBody = new FormBody.Builder() + .add("title", title) + .add("message", message) + .add("priority", gotifySettingVo.getPriority()) + .build(); + + final String requestUrl = gotifySettingVo.getWebServer(); + Log.i(TAG, "requestUrl:" + requestUrl); + + Observable + .create((ObservableEmitter emitter) -> { + Toast(handError, TAG, "开始请求接口..."); + + final Request request = new Request.Builder() + .url(requestUrl) + .post(formBody) + .build(); + + OkHttpClient client = new OkHttpClient(); + Call call = client.newCall(request); + call.enqueue(new Callback() { + @Override + public void onFailure(@NonNull Call call, @NonNull final IOException e) { + LogUtil.updateLog(logId, 0, e.getMessage()); + Toast(handError, TAG, "发送失败:" + e.getMessage()); + emitter.onError(new RuntimeException("请求接口异常...")); + } + + @Override + public void onResponse(@NonNull Call call, @NonNull Response response) throws IOException { + final String responseStr = Objects.requireNonNull(response.body()).string(); + Log.d(TAG, "Response:" + response.code() + "," + responseStr); + Toast(handError, TAG, "发送状态:" + responseStr); + + //TODO:粗略解析是否发送成功 + if ("200".equals(response.code())) { + LogUtil.updateLog(logId, 2, responseStr); + } else { + LogUtil.updateLog(logId, 0, responseStr); + } + } + }); + + }).retryWhen((Observable errorObservable) -> errorObservable + .zipWith(Observable.just( + SettingUtil.getRetryDelayTime(1), + SettingUtil.getRetryDelayTime(2), + SettingUtil.getRetryDelayTime(3), + SettingUtil.getRetryDelayTime(4), + SettingUtil.getRetryDelayTime(5) + ), (Throwable e, Integer time) -> time) + .flatMap((Integer delay) -> { + Toast(handError, TAG, "请求接口异常," + delay + "秒后重试"); + return Observable.timer(delay, TimeUnit.SECONDS); + })) + .subscribe(System.out::println); + } + +} diff --git a/app/src/main/res/layout/alert_dialog_setview_gotify.xml b/app/src/main/res/layout/alert_dialog_setview_gotify.xml new file mode 100644 index 00000000..b292a666 --- /dev/null +++ b/app/src/main/res/layout/alert_dialog_setview_gotify.xml @@ -0,0 +1,218 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +