diff --git a/app/src/main/java/com/idormy/sms/forwarder/entity/setting/WeworkRobotSetting.kt b/app/src/main/java/com/idormy/sms/forwarder/entity/setting/WeworkRobotSetting.kt index 39276114..ef8b376a 100644 --- a/app/src/main/java/com/idormy/sms/forwarder/entity/setting/WeworkRobotSetting.kt +++ b/app/src/main/java/com/idormy/sms/forwarder/entity/setting/WeworkRobotSetting.kt @@ -1,7 +1,18 @@ package com.idormy.sms.forwarder.entity.setting +import com.idormy.sms.forwarder.R import java.io.Serializable data class WeworkRobotSetting( var webHook: String, -) : Serializable \ No newline at end of file + val msgType: String = "text", +) : Serializable { + + fun getMsgTypeCheckId(): Int { + return if (msgType == "markdown") { + R.id.rb_msg_type_markdown + } else { + R.id.rb_msg_type_text + } + } +} \ No newline at end of file diff --git a/app/src/main/java/com/idormy/sms/forwarder/fragment/senders/WeworkRobotFragment.kt b/app/src/main/java/com/idormy/sms/forwarder/fragment/senders/WeworkRobotFragment.kt index ef7cbad6..03666d7a 100644 --- a/app/src/main/java/com/idormy/sms/forwarder/fragment/senders/WeworkRobotFragment.kt +++ b/app/src/main/java/com/idormy/sms/forwarder/fragment/senders/WeworkRobotFragment.kt @@ -1,215 +1,218 @@ -package com.idormy.sms.forwarder.fragment.senders - -import android.os.Looper -import android.text.TextUtils -import android.util.Log -import android.view.LayoutInflater -import android.view.View -import android.view.ViewGroup -import androidx.fragment.app.viewModels -import com.google.gson.Gson -import com.idormy.sms.forwarder.R -import com.idormy.sms.forwarder.core.BaseFragment -import com.idormy.sms.forwarder.database.AppDatabase -import com.idormy.sms.forwarder.database.entity.Sender -import com.idormy.sms.forwarder.database.viewmodel.BaseViewModelFactory -import com.idormy.sms.forwarder.database.viewmodel.SenderViewModel -import com.idormy.sms.forwarder.databinding.FragmentSendersWeworkRobotBinding -import com.idormy.sms.forwarder.entity.MsgInfo -import com.idormy.sms.forwarder.entity.setting.WeworkRobotSetting -import com.idormy.sms.forwarder.utils.* -import com.idormy.sms.forwarder.utils.sender.WeworkRobotUtils -import com.jeremyliao.liveeventbus.LiveEventBus -import com.xuexiang.xaop.annotation.SingleClick -import com.xuexiang.xpage.annotation.Page -import com.xuexiang.xrouter.annotation.AutoWired -import com.xuexiang.xrouter.launcher.XRouter -import com.xuexiang.xui.utils.CountDownButtonHelper -import com.xuexiang.xui.widget.actionbar.TitleBar -import com.xuexiang.xui.widget.dialog.materialdialog.DialogAction -import com.xuexiang.xui.widget.dialog.materialdialog.MaterialDialog -import io.reactivex.SingleObserver -import io.reactivex.android.schedulers.AndroidSchedulers -import io.reactivex.disposables.Disposable -import io.reactivex.schedulers.Schedulers -import java.util.* - -@Page(name = "企业微信群机器人") -@Suppress("PrivatePropertyName") -class WeworkRobotFragment : BaseFragment(), View.OnClickListener { - - private val TAG: String = WeworkRobotFragment::class.java.simpleName - var titleBar: TitleBar? = null - private val viewModel by viewModels { BaseViewModelFactory(context) } - private var mCountDownHelper: CountDownButtonHelper? = null - - @JvmField - @AutoWired(name = KEY_SENDER_ID) - var senderId: Long = 0 - - @JvmField - @AutoWired(name = KEY_SENDER_TYPE) - var senderType: Int = 0 - - @JvmField - @AutoWired(name = KEY_SENDER_CLONE) - var isClone: Boolean = false - - override fun initArgs() { - XRouter.getInstance().inject(this) - } - - override fun viewBindingInflate( - inflater: LayoutInflater, - container: ViewGroup, - ): FragmentSendersWeworkRobotBinding { - return FragmentSendersWeworkRobotBinding.inflate(inflater, container, false) - } - - override fun initTitle(): TitleBar? { - titleBar = super.initTitle()!!.setImmersive(false).setTitle(R.string.wework_robot) - return titleBar - } - - /** - * 初始化控件 - */ - override fun initViews() { - //测试按钮增加倒计时,避免重复点击 - mCountDownHelper = CountDownButtonHelper(binding!!.btnTest, SettingUtils.requestTimeout) - mCountDownHelper!!.setOnCountDownListener(object : CountDownButtonHelper.OnCountDownListener { - override fun onCountDown(time: Int) { - binding!!.btnTest.text = String.format(getString(R.string.seconds_n), time) - } - - override fun onFinished() { - binding!!.btnTest.text = getString(R.string.test) - } - }) - - //新增 - if (senderId <= 0) { - titleBar?.setSubTitle(getString(R.string.add_sender)) - binding!!.btnDel.setText(R.string.discard) - return - } - - //编辑 - binding!!.btnDel.setText(R.string.del) - AppDatabase.getInstance(requireContext()) - .senderDao() - .get(senderId) - .subscribeOn(Schedulers.io()) - .observeOn(AndroidSchedulers.mainThread()) - .subscribe(object : SingleObserver { - override fun onSubscribe(d: Disposable) {} - - override fun onError(e: Throwable) { - e.printStackTrace() - } - - override fun onSuccess(sender: Sender) { - if (isClone) { - titleBar?.setSubTitle(getString(R.string.clone_sender) + ": " + sender.name) - binding!!.btnDel.setText(R.string.discard) - } else { - titleBar?.setSubTitle(getString(R.string.edit_sender) + ": " + sender.name) - } - binding!!.etName.setText(sender.name) - binding!!.sbEnable.isChecked = sender.status == 1 - val settingVo = Gson().fromJson(sender.jsonSetting, WeworkRobotSetting::class.java) - Log.d(TAG, settingVo.toString()) - if (settingVo != null) { - binding!!.etWebHook.setText(settingVo.webHook) - } - } - }) - } - - override fun initListeners() { - binding!!.btnTest.setOnClickListener(this) - binding!!.btnDel.setOnClickListener(this) - binding!!.btnSave.setOnClickListener(this) - LiveEventBus.get(KEY_SENDER_TEST, String::class.java).observe(this) { mCountDownHelper?.finish() } - } - - @SingleClick - override fun onClick(v: View) { - try { - when (v.id) { - R.id.btn_test -> { - mCountDownHelper?.start() - Thread { - try { - val settingVo = checkSetting() - Log.d(TAG, settingVo.toString()) - val msgInfo = MsgInfo("sms", getString(R.string.test_phone_num), getString(R.string.test_sender_sms), Date(), getString(R.string.test_sim_info)) - WeworkRobotUtils.sendMsg(settingVo, msgInfo) - } catch (e: Exception) { - e.printStackTrace() - if (Looper.myLooper() == null) Looper.prepare() - XToastUtils.error(e.message.toString()) - Looper.loop() - } - LiveEventBus.get(KEY_SENDER_TEST, String::class.java).post("finish") - }.start() - return - } - R.id.btn_del -> { - if (senderId <= 0 || isClone) { - popToBack() - return - } - - MaterialDialog.Builder(requireContext()) - .title(R.string.delete_sender_title) - .content(R.string.delete_sender_tips) - .positiveText(R.string.lab_yes) - .negativeText(R.string.lab_no) - .onPositive { _: MaterialDialog?, _: DialogAction? -> - viewModel.delete(senderId) - XToastUtils.success(R.string.delete_sender_toast) - popToBack() - } - .show() - return - } - R.id.btn_save -> { - val name = binding!!.etName.text.toString().trim() - if (TextUtils.isEmpty(name)) { - throw Exception(getString(R.string.invalid_name)) - } - - val status = if (binding!!.sbEnable.isChecked) 1 else 0 - val settingVo = checkSetting() - if (isClone) senderId = 0 - val senderNew = Sender(senderId, senderType, name, Gson().toJson(settingVo), status) - Log.d(TAG, senderNew.toString()) - - viewModel.insertOrUpdate(senderNew) - XToastUtils.success(R.string.tipSaveSuccess) - popToBack() - return - } - } - } catch (e: Exception) { - XToastUtils.error(e.message.toString()) - e.printStackTrace() - } - } - - private fun checkSetting(): WeworkRobotSetting { - val webHook = binding!!.etWebHook.text.toString().trim() - if (!CommonUtils.checkUrl(webHook, false)) { - throw Exception(getString(R.string.invalid_webhook)) - } - - return WeworkRobotSetting(webHook) - } - - override fun onDestroyView() { - if (mCountDownHelper != null) mCountDownHelper!!.recycle() - super.onDestroyView() - } - +package com.idormy.sms.forwarder.fragment.senders + +import android.os.Looper +import android.text.TextUtils +import android.util.Log +import android.view.LayoutInflater +import android.view.View +import android.view.ViewGroup +import androidx.fragment.app.viewModels +import com.google.gson.Gson +import com.idormy.sms.forwarder.R +import com.idormy.sms.forwarder.core.BaseFragment +import com.idormy.sms.forwarder.database.AppDatabase +import com.idormy.sms.forwarder.database.entity.Sender +import com.idormy.sms.forwarder.database.viewmodel.BaseViewModelFactory +import com.idormy.sms.forwarder.database.viewmodel.SenderViewModel +import com.idormy.sms.forwarder.databinding.FragmentSendersWeworkRobotBinding +import com.idormy.sms.forwarder.entity.MsgInfo +import com.idormy.sms.forwarder.entity.setting.WeworkRobotSetting +import com.idormy.sms.forwarder.utils.* +import com.idormy.sms.forwarder.utils.sender.WeworkRobotUtils +import com.jeremyliao.liveeventbus.LiveEventBus +import com.xuexiang.xaop.annotation.SingleClick +import com.xuexiang.xpage.annotation.Page +import com.xuexiang.xrouter.annotation.AutoWired +import com.xuexiang.xrouter.launcher.XRouter +import com.xuexiang.xui.utils.CountDownButtonHelper +import com.xuexiang.xui.widget.actionbar.TitleBar +import com.xuexiang.xui.widget.dialog.materialdialog.DialogAction +import com.xuexiang.xui.widget.dialog.materialdialog.MaterialDialog +import io.reactivex.SingleObserver +import io.reactivex.android.schedulers.AndroidSchedulers +import io.reactivex.disposables.Disposable +import io.reactivex.schedulers.Schedulers +import java.util.* + +@Page(name = "企业微信群机器人") +@Suppress("PrivatePropertyName") +class WeworkRobotFragment : BaseFragment(), View.OnClickListener { + + private val TAG: String = WeworkRobotFragment::class.java.simpleName + var titleBar: TitleBar? = null + private val viewModel by viewModels { BaseViewModelFactory(context) } + private var mCountDownHelper: CountDownButtonHelper? = null + + @JvmField + @AutoWired(name = KEY_SENDER_ID) + var senderId: Long = 0 + + @JvmField + @AutoWired(name = KEY_SENDER_TYPE) + var senderType: Int = 0 + + @JvmField + @AutoWired(name = KEY_SENDER_CLONE) + var isClone: Boolean = false + + override fun initArgs() { + XRouter.getInstance().inject(this) + } + + override fun viewBindingInflate( + inflater: LayoutInflater, + container: ViewGroup, + ): FragmentSendersWeworkRobotBinding { + return FragmentSendersWeworkRobotBinding.inflate(inflater, container, false) + } + + override fun initTitle(): TitleBar? { + titleBar = super.initTitle()!!.setImmersive(false).setTitle(R.string.wework_robot) + return titleBar + } + + /** + * 初始化控件 + */ + override fun initViews() { + //测试按钮增加倒计时,避免重复点击 + mCountDownHelper = CountDownButtonHelper(binding!!.btnTest, SettingUtils.requestTimeout) + mCountDownHelper!!.setOnCountDownListener(object : CountDownButtonHelper.OnCountDownListener { + override fun onCountDown(time: Int) { + binding!!.btnTest.text = String.format(getString(R.string.seconds_n), time) + } + + override fun onFinished() { + binding!!.btnTest.text = getString(R.string.test) + } + }) + + //新增 + if (senderId <= 0) { + titleBar?.setSubTitle(getString(R.string.add_sender)) + binding!!.btnDel.setText(R.string.discard) + return + } + + //编辑 + binding!!.btnDel.setText(R.string.del) + AppDatabase.getInstance(requireContext()) + .senderDao() + .get(senderId) + .subscribeOn(Schedulers.io()) + .observeOn(AndroidSchedulers.mainThread()) + .subscribe(object : SingleObserver { + override fun onSubscribe(d: Disposable) {} + + override fun onError(e: Throwable) { + e.printStackTrace() + } + + override fun onSuccess(sender: Sender) { + if (isClone) { + titleBar?.setSubTitle(getString(R.string.clone_sender) + ": " + sender.name) + binding!!.btnDel.setText(R.string.discard) + } else { + titleBar?.setSubTitle(getString(R.string.edit_sender) + ": " + sender.name) + } + binding!!.etName.setText(sender.name) + binding!!.sbEnable.isChecked = sender.status == 1 + val settingVo = Gson().fromJson(sender.jsonSetting, WeworkRobotSetting::class.java) + Log.d(TAG, settingVo.toString()) + if (settingVo != null) { + binding!!.etWebHook.setText(settingVo.webHook) + binding!!.rgMsgType.check(settingVo.getMsgTypeCheckId()) + } + } + }) + } + + override fun initListeners() { + binding!!.btnTest.setOnClickListener(this) + binding!!.btnDel.setOnClickListener(this) + binding!!.btnSave.setOnClickListener(this) + LiveEventBus.get(KEY_SENDER_TEST, String::class.java).observe(this) { mCountDownHelper?.finish() } + } + + @SingleClick + override fun onClick(v: View) { + try { + when (v.id) { + R.id.btn_test -> { + mCountDownHelper?.start() + Thread { + try { + val settingVo = checkSetting() + Log.d(TAG, settingVo.toString()) + val msgInfo = MsgInfo("sms", getString(R.string.test_phone_num), getString(R.string.test_sender_sms), Date(), getString(R.string.test_sim_info)) + WeworkRobotUtils.sendMsg(settingVo, msgInfo) + } catch (e: Exception) { + e.printStackTrace() + if (Looper.myLooper() == null) Looper.prepare() + XToastUtils.error(e.message.toString()) + Looper.loop() + } + LiveEventBus.get(KEY_SENDER_TEST, String::class.java).post("finish") + }.start() + return + } + + R.id.btn_del -> { + if (senderId <= 0 || isClone) { + popToBack() + return + } + + MaterialDialog.Builder(requireContext()) + .title(R.string.delete_sender_title) + .content(R.string.delete_sender_tips) + .positiveText(R.string.lab_yes) + .negativeText(R.string.lab_no) + .onPositive { _: MaterialDialog?, _: DialogAction? -> + viewModel.delete(senderId) + XToastUtils.success(R.string.delete_sender_toast) + popToBack() + } + .show() + return + } + + R.id.btn_save -> { + val name = binding!!.etName.text.toString().trim() + if (TextUtils.isEmpty(name)) { + throw Exception(getString(R.string.invalid_name)) + } + + val status = if (binding!!.sbEnable.isChecked) 1 else 0 + val settingVo = checkSetting() + if (isClone) senderId = 0 + val senderNew = Sender(senderId, senderType, name, Gson().toJson(settingVo), status) + Log.d(TAG, senderNew.toString()) + + viewModel.insertOrUpdate(senderNew) + XToastUtils.success(R.string.tipSaveSuccess) + popToBack() + return + } + } + } catch (e: Exception) { + XToastUtils.error(e.message.toString()) + e.printStackTrace() + } + } + + private fun checkSetting(): WeworkRobotSetting { + val webHook = binding!!.etWebHook.text.toString().trim() + if (!CommonUtils.checkUrl(webHook, false)) { + throw Exception(getString(R.string.invalid_webhook)) + } + val msgType = if (binding!!.rgMsgType.checkedRadioButtonId == R.id.rb_msg_type_markdown) "markdown" else "text" + return WeworkRobotSetting(webHook, msgType) + } + + override fun onDestroyView() { + if (mCountDownHelper != null) mCountDownHelper!!.recycle() + super.onDestroyView() + } + } \ No newline at end of file diff --git a/app/src/main/java/com/idormy/sms/forwarder/utils/sender/WeworkRobotUtils.kt b/app/src/main/java/com/idormy/sms/forwarder/utils/sender/WeworkRobotUtils.kt index 401cad89..b4e3f454 100644 --- a/app/src/main/java/com/idormy/sms/forwarder/utils/sender/WeworkRobotUtils.kt +++ b/app/src/main/java/com/idormy/sms/forwarder/utils/sender/WeworkRobotUtils.kt @@ -13,7 +13,6 @@ import com.xuexiang.xhttp2.cache.model.CacheMode import com.xuexiang.xhttp2.callback.SimpleCallBack import com.xuexiang.xhttp2.exception.ApiException -@Suppress("PrivatePropertyName", "UNUSED_PARAMETER") class WeworkRobotUtils private constructor() { companion object { @@ -37,11 +36,17 @@ class WeworkRobotUtils private constructor() { Log.i(TAG, "requestUrl:$requestUrl") val msgMap: MutableMap = mutableMapOf() - msgMap["msgtype"] = "text" + msgMap["msgtype"] = setting.msgType - val textText: MutableMap = mutableMapOf() - textText["content"] = content - msgMap["text"] = textText + if (setting.msgType == "markdown") { + val markdownText: MutableMap = mutableMapOf() + markdownText["content"] = content + msgMap["markdown"] = markdownText + } else { + val textText: MutableMap = mutableMapOf() + textText["content"] = content + msgMap["text"] = textText + } val requestMsg: String = Gson().toJson(msgMap) Log.i(TAG, "requestMsg:$requestMsg") diff --git a/app/src/main/res/layout/fragment_senders_wework_robot.xml b/app/src/main/res/layout/fragment_senders_wework_robot.xml index a036138d..78cd8979 100644 --- a/app/src/main/res/layout/fragment_senders_wework_robot.xml +++ b/app/src/main/res/layout/fragment_senders_wework_robot.xml @@ -1,122 +1,158 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/app/src/main/res/values-en/strings.xml b/app/src/main/res/values-en/strings.xml index 1e3db3f2..48f15266 100644 --- a/app/src/main/res/values-en/strings.xml +++ b/app/src/main/res/values-en/strings.xml @@ -559,10 +559,10 @@ It is recommended to open the first three switch, do not disable the notification bar, to avoid APP being killed Custom Settings Please fill in the remarks manually or click the refresh button to get it automatically - , + times Interval Timeout - s + secs %s sec Retry [Test Channel] Congratulations, the sending channel test is successful, please continue to add forwarding rules! @@ -743,6 +743,9 @@ WebHook Example: https://qyapi.weixin.qq.com/cgixx?key=xxx + Msg Type + Text + Markdown URL Scheme Example:myapp://api/add?&type=0&msg=[msg] diff --git a/app/src/main/res/values/strings.xml b/app/src/main/res/values/strings.xml index d2d4c3b7..c3fe63e0 100644 --- a/app/src/main/res/values/strings.xml +++ b/app/src/main/res/values/strings.xml @@ -744,6 +744,9 @@ WebHook地址 示例:https://qyapi.weixin.qq.com/cgixx?key=xxx + 消息类型 + 纯文本 + markdown URL Scheme 示例:myapp://api/add?&type=0&msg=[msg]