You cannot select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
280 lines
12 KiB
Kotlin
280 lines
12 KiB
Kotlin
package com.idormy.sms.forwarder.fragment.senders
|
|
|
|
import android.text.TextUtils
|
|
import android.util.Log
|
|
import android.view.LayoutInflater
|
|
import android.view.View
|
|
import android.view.ViewGroup
|
|
import android.widget.CompoundButton
|
|
import android.widget.EditText
|
|
import android.widget.RadioGroup
|
|
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.FragmentSendersDingtalkGroupRobotBinding
|
|
import com.idormy.sms.forwarder.entity.MsgInfo
|
|
import com.idormy.sms.forwarder.entity.setting.DingtalkGroupRobotSetting
|
|
import com.idormy.sms.forwarder.utils.CommonUtils
|
|
import com.idormy.sms.forwarder.utils.EVENT_TOAST_ERROR
|
|
import com.idormy.sms.forwarder.utils.KEY_SENDER_CLONE
|
|
import com.idormy.sms.forwarder.utils.KEY_SENDER_ID
|
|
import com.idormy.sms.forwarder.utils.KEY_SENDER_TEST
|
|
import com.idormy.sms.forwarder.utils.KEY_SENDER_TYPE
|
|
import com.idormy.sms.forwarder.utils.SettingUtils
|
|
import com.idormy.sms.forwarder.utils.XToastUtils
|
|
import com.idormy.sms.forwarder.utils.sender.DingtalkGroupRobotUtils
|
|
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.Date
|
|
|
|
@Page(name = "钉钉群机器人")
|
|
@Suppress("PrivatePropertyName")
|
|
class DingtalkGroupRobotFragment : BaseFragment<FragmentSendersDingtalkGroupRobotBinding?>(), View.OnClickListener, CompoundButton.OnCheckedChangeListener {
|
|
|
|
private val TAG: String = DingtalkGroupRobotFragment::class.java.simpleName
|
|
private var titleBar: TitleBar? = null
|
|
private val viewModel by viewModels<SenderViewModel> { 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,
|
|
): FragmentSendersDingtalkGroupRobotBinding {
|
|
return FragmentSendersDingtalkGroupRobotBinding.inflate(inflater, container, false)
|
|
}
|
|
|
|
override fun initTitle(): TitleBar? {
|
|
titleBar = super.initTitle()!!.setImmersive(false).setTitle(R.string.dingtalk_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<Sender> {
|
|
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, DingtalkGroupRobotSetting::class.java)
|
|
Log.d(TAG, settingVo.toString())
|
|
if (settingVo != null) {
|
|
binding!!.etToken.setText(settingVo.token)
|
|
binding!!.etSecret.setText(settingVo.secret)
|
|
binding!!.sbAtAll.isChecked = settingVo.atAll == true
|
|
binding!!.etAtMobiles.setText(settingVo.atMobiles)
|
|
binding!!.etAtDingtalkIds.setText(settingVo.atDingtalkIds)
|
|
binding!!.rgMsgType.check(settingVo.getMsgTypeCheckId())
|
|
binding!!.etTitleTemplate.setText(settingVo.titleTemplate)
|
|
}
|
|
}
|
|
})
|
|
}
|
|
|
|
override fun initListeners() {
|
|
binding!!.btInsertSender.setOnClickListener(this)
|
|
binding!!.btInsertExtra.setOnClickListener(this)
|
|
binding!!.btInsertTime.setOnClickListener(this)
|
|
binding!!.btInsertDeviceName.setOnClickListener(this)
|
|
binding!!.btnTest.setOnClickListener(this)
|
|
binding!!.btnDel.setOnClickListener(this)
|
|
binding!!.btnSave.setOnClickListener(this)
|
|
binding!!.sbAtAll.setOnCheckedChangeListener(this)
|
|
binding!!.rgMsgType.setOnCheckedChangeListener { _: RadioGroup?, checkedId: Int ->
|
|
binding!!.layoutCustomTemplate.visibility = if (checkedId == R.id.rb_msg_type_markdown) View.VISIBLE else View.GONE
|
|
}
|
|
LiveEventBus.get(KEY_SENDER_TEST, String::class.java).observe(this) { mCountDownHelper?.finish() }
|
|
}
|
|
|
|
override fun onCheckedChanged(buttonView: CompoundButton?, isChecked: Boolean) {
|
|
//这里只有一个监听不需要判断id
|
|
if (isChecked) {
|
|
binding!!.layoutAtMobiles.visibility = View.GONE
|
|
binding!!.layoutAtDingtalkIds.visibility = View.GONE
|
|
binding!!.etAtMobiles.setText("")
|
|
binding!!.etAtDingtalkIds.setText("")
|
|
} else {
|
|
binding!!.layoutAtMobiles.visibility = View.VISIBLE
|
|
binding!!.layoutAtDingtalkIds.visibility = View.VISIBLE
|
|
}
|
|
}
|
|
|
|
@SingleClick
|
|
override fun onClick(v: View) {
|
|
try {
|
|
val etTitleTemplate: EditText = binding!!.etTitleTemplate
|
|
when (v.id) {
|
|
R.id.bt_insert_sender -> {
|
|
CommonUtils.insertOrReplaceText2Cursor(etTitleTemplate, getString(R.string.tag_from))
|
|
return
|
|
}
|
|
|
|
R.id.bt_insert_extra -> {
|
|
CommonUtils.insertOrReplaceText2Cursor(etTitleTemplate, getString(R.string.tag_card_slot))
|
|
return
|
|
}
|
|
|
|
R.id.bt_insert_time -> {
|
|
CommonUtils.insertOrReplaceText2Cursor(etTitleTemplate, getString(R.string.tag_receive_time))
|
|
return
|
|
}
|
|
|
|
R.id.bt_insert_device_name -> {
|
|
CommonUtils.insertOrReplaceText2Cursor(etTitleTemplate, getString(R.string.tag_device_name))
|
|
return
|
|
}
|
|
|
|
R.id.btn_test -> {
|
|
mCountDownHelper?.start()
|
|
Thread {
|
|
try {
|
|
val settingVo = checkSetting()
|
|
Log.d(TAG, settingVo.toString())
|
|
val name = binding!!.etName.text.toString().trim().takeIf { it.isNotEmpty() } ?: getString(R.string.test_sender_name)
|
|
val msgInfo = MsgInfo("sms", getString(R.string.test_phone_num), String.format(getString(R.string.test_sender_sms), name), Date(), getString(R.string.test_sim_info))
|
|
DingtalkGroupRobotUtils.sendMsg(settingVo, msgInfo)
|
|
} catch (e: Exception) {
|
|
e.printStackTrace()
|
|
LiveEventBus.get(EVENT_TOAST_ERROR, String::class.java).post(e.message.toString())
|
|
}
|
|
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(): DingtalkGroupRobotSetting {
|
|
val token = binding!!.etToken.text.toString().trim()
|
|
if (TextUtils.isEmpty(token)) {
|
|
throw Exception(getString(R.string.invalid_token))
|
|
}
|
|
|
|
val secret = binding!!.etSecret.text.toString().trim()
|
|
val atAll = binding!!.sbAtAll.isChecked
|
|
val atMobiles = binding!!.etAtMobiles.text.toString().trim()
|
|
val atDingtalkIds = binding!!.etAtDingtalkIds.text.toString().trim()
|
|
val msgType = if (binding!!.rgMsgType.checkedRadioButtonId == R.id.rb_msg_type_markdown) "markdown" else "text"
|
|
val titleTemplate = binding!!.etTitleTemplate.text.toString().trim()
|
|
|
|
return DingtalkGroupRobotSetting(token, secret, atAll, atMobiles, atDingtalkIds, msgType, titleTemplate)
|
|
}
|
|
|
|
override fun onDestroyView() {
|
|
if (mCountDownHelper != null) mCountDownHelper!!.recycle()
|
|
super.onDestroyView()
|
|
}
|
|
|
|
} |