From 3fc0a953e70ce9ce7fa14690ca600f0b1a663421 Mon Sep 17 00:00:00 2001 From: pppscn <35696959@qq.com> Date: Tue, 20 Feb 2024 22:20:58 +0800 Subject: [PATCH] =?UTF-8?q?=E6=96=B0=E5=A2=9E=EF=BC=9A=E8=87=AA=E5=8A=A8?= =?UTF-8?q?=E4=BB=BB=E5=8A=A1=C2=B7=E5=BF=AB=E6=8D=B7=E6=8C=87=E4=BB=A4=20?= =?UTF-8?q?=E2=80=94=E2=80=94=20=E6=89=A7=E8=A1=8C=E5=8A=A8=E4=BD=9C?= =?UTF-8?q?=EF=BC=9A=E9=87=8D=E5=8F=91=E6=B6=88=E6=81=AF?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../sms/forwarder/database/dao/LogsDao.kt | 5 + .../database/repository/LogsRepository.kt | 17 ++ .../forwarder/entity/action/ResendSetting.kt | 9 + .../forwarder/fragment/TasksEditFragment.kt | 7 + .../fragment/action/CleanerFragment.kt | 2 +- .../fragment/action/ResendFragment.kt | 171 +++++++++++++++++ .../idormy/sms/forwarder/utils/Constants.kt | 1 + .../sms/forwarder/utils/task/TaskUtils.kt | 6 + .../sms/forwarder/workers/ActionWorker.kt | 19 ++ .../res/drawable/auto_task_icon_resend.xml | 20 ++ .../drawable/auto_task_icon_resend_grey.xml | 20 ++ app/src/main/res/layout/fragment_settings.xml | 1 - .../layout/fragment_tasks_action_cleaner.xml | 44 ++--- .../layout/fragment_tasks_action_resend.xml | 177 ++++++++++++++++++ app/src/main/res/values-en/strings.xml | 6 + app/src/main/res/values-zh-rCN/strings.xml | 6 + app/src/main/res/values-zh-rTW/strings.xml | 6 + app/src/main/res/values/strings.xml | 6 + 18 files changed, 491 insertions(+), 32 deletions(-) create mode 100644 app/src/main/java/com/idormy/sms/forwarder/entity/action/ResendSetting.kt create mode 100644 app/src/main/java/com/idormy/sms/forwarder/fragment/action/ResendFragment.kt create mode 100644 app/src/main/res/drawable/auto_task_icon_resend.xml create mode 100644 app/src/main/res/drawable/auto_task_icon_resend_grey.xml create mode 100644 app/src/main/res/layout/fragment_tasks_action_resend.xml diff --git a/app/src/main/java/com/idormy/sms/forwarder/database/dao/LogsDao.kt b/app/src/main/java/com/idormy/sms/forwarder/database/dao/LogsDao.kt index ff429cfd..17992af2 100644 --- a/app/src/main/java/com/idormy/sms/forwarder/database/dao/LogsDao.kt +++ b/app/src/main/java/com/idormy/sms/forwarder/database/dao/LogsDao.kt @@ -6,8 +6,10 @@ import androidx.room.Delete import androidx.room.Insert import androidx.room.OnConflictStrategy import androidx.room.Query +import androidx.room.RawQuery import androidx.room.Transaction import androidx.room.Update +import androidx.sqlite.db.SupportSQLiteQuery import com.idormy.sms.forwarder.database.entity.Logs import com.idormy.sms.forwarder.database.entity.LogsAndRuleAndSender import io.reactivex.Completable @@ -67,4 +69,7 @@ interface LogsDao { @Query("SELECT * FROM Logs WHERE type = :type ORDER BY id DESC") fun pagingSource(type: String): PagingSource + @Transaction + @RawQuery(observedEntities = [Logs::class]) + fun getLogsRaw(query: SupportSQLiteQuery): List } \ No newline at end of file diff --git a/app/src/main/java/com/idormy/sms/forwarder/database/repository/LogsRepository.kt b/app/src/main/java/com/idormy/sms/forwarder/database/repository/LogsRepository.kt index 33c05d5e..ee7eb40c 100644 --- a/app/src/main/java/com/idormy/sms/forwarder/database/repository/LogsRepository.kt +++ b/app/src/main/java/com/idormy/sms/forwarder/database/repository/LogsRepository.kt @@ -1,6 +1,7 @@ package com.idormy.sms.forwarder.database.repository import androidx.annotation.WorkerThread +import androidx.sqlite.db.SimpleSQLiteQuery import com.idormy.sms.forwarder.database.dao.LogsDao import com.idormy.sms.forwarder.database.entity.Logs @@ -22,4 +23,20 @@ class LogsRepository(private val logsDao: LogsDao) { fun getOne(id: Long) = logsDao.getOne(id) + fun getIdsByTimeAndStatus(hours: Int, statusList: List): List { + var sql = "SELECT * FROM Logs WHERE 1=1" + if (hours > 0) { + val time = System.currentTimeMillis() - hours * 3600000 + sql += " AND time>=$time" + } + if (statusList.isNotEmpty()) { + val statusListStr = statusList.joinToString(",") + sql += " AND forward_status IN ($statusListStr)" + } + sql += " ORDER BY id ASC" + + val query = SimpleSQLiteQuery(sql) + return logsDao.getLogsRaw(query) + } + } \ No newline at end of file diff --git a/app/src/main/java/com/idormy/sms/forwarder/entity/action/ResendSetting.kt b/app/src/main/java/com/idormy/sms/forwarder/entity/action/ResendSetting.kt new file mode 100644 index 00000000..2ec9707a --- /dev/null +++ b/app/src/main/java/com/idormy/sms/forwarder/entity/action/ResendSetting.kt @@ -0,0 +1,9 @@ +package com.idormy.sms.forwarder.entity.action + +import java.io.Serializable + +data class ResendSetting( + var description: String = "", //描述 + var hours: Int = 1, //自动重发N小时以来的转发记录,0=不限制 + var statusList: List = listOf(0), //状态列表,默认只重发失败的 +) : Serializable diff --git a/app/src/main/java/com/idormy/sms/forwarder/fragment/TasksEditFragment.kt b/app/src/main/java/com/idormy/sms/forwarder/fragment/TasksEditFragment.kt index f75173b8..39ead034 100644 --- a/app/src/main/java/com/idormy/sms/forwarder/fragment/TasksEditFragment.kt +++ b/app/src/main/java/com/idormy/sms/forwarder/fragment/TasksEditFragment.kt @@ -201,6 +201,13 @@ class TasksEditFragment : BaseFragment(), View.OnClic CoreAnim.slide, R.drawable.auto_task_icon_alarm ), + PageInfo( + getString(R.string.task_resend), + "com.idormy.sms.forwarder.fragment.action.ResendFragment", + "{\"\":\"\"}", + CoreAnim.slide, + R.drawable.auto_task_icon_resend + ), ) override fun initArgs() { diff --git a/app/src/main/java/com/idormy/sms/forwarder/fragment/action/CleanerFragment.kt b/app/src/main/java/com/idormy/sms/forwarder/fragment/action/CleanerFragment.kt index 6f2d221c..4fc8a9d9 100644 --- a/app/src/main/java/com/idormy/sms/forwarder/fragment/action/CleanerFragment.kt +++ b/app/src/main/java/com/idormy/sms/forwarder/fragment/action/CleanerFragment.kt @@ -141,7 +141,7 @@ class CleanerFragment : BaseFragment(), View @SuppressLint("SetTextI18n") private fun checkSetting(): CleanerSetting { val days = binding!!.xsbDays.selectedNumber - val description = "自动删除${days}天前的转发记录" + val description = String.format(getString(R.string.task_cleaner_desc), days) return CleanerSetting(description, days) } } \ No newline at end of file diff --git a/app/src/main/java/com/idormy/sms/forwarder/fragment/action/ResendFragment.kt b/app/src/main/java/com/idormy/sms/forwarder/fragment/action/ResendFragment.kt new file mode 100644 index 00000000..597bf4cb --- /dev/null +++ b/app/src/main/java/com/idormy/sms/forwarder/fragment/action/ResendFragment.kt @@ -0,0 +1,171 @@ +package com.idormy.sms.forwarder.fragment.action + +import android.annotation.SuppressLint +import android.content.Intent +import android.view.LayoutInflater +import android.view.View +import android.view.ViewGroup +import androidx.work.Data +import androidx.work.OneTimeWorkRequestBuilder +import androidx.work.WorkManager +import com.google.gson.Gson +import com.idormy.sms.forwarder.R +import com.idormy.sms.forwarder.core.BaseFragment +import com.idormy.sms.forwarder.databinding.FragmentTasksActionResendBinding +import com.idormy.sms.forwarder.entity.MsgInfo +import com.idormy.sms.forwarder.entity.TaskSetting +import com.idormy.sms.forwarder.entity.action.ResendSetting +import com.idormy.sms.forwarder.utils.KEY_BACK_DATA_ACTION +import com.idormy.sms.forwarder.utils.KEY_BACK_DESCRIPTION_ACTION +import com.idormy.sms.forwarder.utils.KEY_EVENT_DATA_ACTION +import com.idormy.sms.forwarder.utils.Log +import com.idormy.sms.forwarder.utils.TASK_ACTION_RESEND +import com.idormy.sms.forwarder.utils.TaskWorker +import com.idormy.sms.forwarder.utils.XToastUtils +import com.idormy.sms.forwarder.workers.ActionWorker +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 java.util.Date + +@Page(name = "Resend") +@Suppress("PrivatePropertyName", "DEPRECATION") +class ResendFragment : BaseFragment(), View.OnClickListener { + + private val TAG: String = ResendFragment::class.java.simpleName + private var titleBar: TitleBar? = null + private var mCountDownHelper: CountDownButtonHelper? = null + + @JvmField + @AutoWired(name = KEY_EVENT_DATA_ACTION) + var eventData: String? = null + + override fun initArgs() { + XRouter.getInstance().inject(this) + } + + override fun viewBindingInflate( + inflater: LayoutInflater, + container: ViewGroup, + ): FragmentTasksActionResendBinding { + return FragmentTasksActionResendBinding.inflate(inflater, container, false) + } + + override fun initTitle(): TitleBar? { + titleBar = super.initTitle()!!.setImmersive(false).setTitle(R.string.task_resend) + return titleBar + } + + /** + * 初始化控件 + */ + override fun initViews() { + //测试按钮增加倒计时,避免重复点击 + mCountDownHelper = CountDownButtonHelper(binding!!.btnTest, 1) + 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) + } + }) + + var settingVo = ResendSetting(getString(R.string.task_resend_tips), 1, listOf(0)) + Log.d(TAG, "initViews eventData:$eventData") + if (eventData != null) { + settingVo = Gson().fromJson(eventData, ResendSetting::class.java) + Log.d(TAG, "initViews settingVo:$settingVo") + } + binding!!.xsbHours.setDefaultValue(settingVo.hours) + settingVo.statusList.forEach { item -> + when (item) { + 0 -> binding!!.scbFailed.isChecked = true + 1 -> binding!!.scbProcessing.isChecked = true + 2 -> binding!!.scbSuccess.isChecked = true + } + } + } + + @SuppressLint("SetTextI18n") + override fun initListeners() { + binding!!.btnTest.setOnClickListener(this) + binding!!.btnDel.setOnClickListener(this) + binding!!.btnSave.setOnClickListener(this) + } + + @SingleClick + override fun onClick(v: View) { + try { + when (v.id) { + R.id.btn_test -> { + mCountDownHelper?.start() + try { + val settingVo = checkSetting() + Log.d(TAG, settingVo.toString()) + val taskAction = TaskSetting(TASK_ACTION_RESEND, getString(R.string.task_resend), settingVo.description, Gson().toJson(settingVo), requestCode) + val taskActionsJson = Gson().toJson(arrayListOf(taskAction)) + val msgInfo = MsgInfo("task", getString(R.string.task_resend), settingVo.description, Date(), getString(R.string.task_resend)) + val actionData = Data.Builder().putLong(TaskWorker.taskId, 0).putString(TaskWorker.taskActions, taskActionsJson).putString(TaskWorker.msgInfo, Gson().toJson(msgInfo)).build() + val actionRequest = OneTimeWorkRequestBuilder().setInputData(actionData).build() + WorkManager.getInstance().enqueue(actionRequest) + } catch (e: Exception) { + mCountDownHelper?.finish() + e.printStackTrace() + Log.e(TAG, "onClick error: ${e.message}") + XToastUtils.error(e.message.toString(), 30000) + } + return + } + + R.id.btn_del -> { + popToBack() + return + } + + R.id.btn_save -> { + val settingVo = checkSetting() + val intent = Intent() + intent.putExtra(KEY_BACK_DESCRIPTION_ACTION, settingVo.description) + intent.putExtra(KEY_BACK_DATA_ACTION, Gson().toJson(settingVo)) + setFragmentResult(TASK_ACTION_RESEND, intent) + popToBack() + return + } + } + } catch (e: Exception) { + XToastUtils.error(e.message.toString(), 30000) + e.printStackTrace() + Log.e(TAG, "onClick error: ${e.message}") + } + } + + //检查设置 + @SuppressLint("SetTextI18n") + private fun checkSetting(): ResendSetting { + val hours = binding!!.xsbHours.selectedNumber + val statusList = mutableListOf() + val statusStrList = mutableListOf() + if (binding!!.scbFailed.isChecked) { + statusList.add(0) + statusStrList.add(getString(R.string.failed)) + } + if (binding!!.scbProcessing.isChecked) { + statusList.add(1) + statusStrList.add(getString(R.string.processing)) + } + if (binding!!.scbSuccess.isChecked) { + statusList.add(2) + statusStrList.add(getString(R.string.success)) + } + if (statusList.isEmpty()) { + throw Exception(getString(R.string.task_resend_error)) + } + val description = String.format(getString(R.string.task_resend_desc), hours, statusStrList.joinToString("/")) + return ResendSetting(description, hours, statusList) + } +} \ No newline at end of file diff --git a/app/src/main/java/com/idormy/sms/forwarder/utils/Constants.kt b/app/src/main/java/com/idormy/sms/forwarder/utils/Constants.kt index 9e2498d2..31551a6e 100644 --- a/app/src/main/java/com/idormy/sms/forwarder/utils/Constants.kt +++ b/app/src/main/java/com/idormy/sms/forwarder/utils/Constants.kt @@ -244,6 +244,7 @@ const val TASK_ACTION_HTTPSERVER = 2005 const val TASK_ACTION_RULE = 2006 const val TASK_ACTION_SENDER = 2007 const val TASK_ACTION_ALARM = 2008 +const val TASK_ACTION_RESEND = 2009 const val SP_BATTERY_INFO = "battery_info" const val SP_BATTERY_STATUS = "battery_status" diff --git a/app/src/main/java/com/idormy/sms/forwarder/utils/task/TaskUtils.kt b/app/src/main/java/com/idormy/sms/forwarder/utils/task/TaskUtils.kt index 0ebcba4d..d72424d6 100644 --- a/app/src/main/java/com/idormy/sms/forwarder/utils/task/TaskUtils.kt +++ b/app/src/main/java/com/idormy/sms/forwarder/utils/task/TaskUtils.kt @@ -18,10 +18,12 @@ import com.idormy.sms.forwarder.utils.SP_NETWORK_STATE import com.idormy.sms.forwarder.utils.SP_SIM_STATE import com.idormy.sms.forwarder.utils.SP_WIFI_SSID import com.idormy.sms.forwarder.utils.SharedPreference +import com.idormy.sms.forwarder.utils.TASK_ACTION_ALARM import com.idormy.sms.forwarder.utils.TASK_ACTION_CLEANER import com.idormy.sms.forwarder.utils.TASK_ACTION_FRPC import com.idormy.sms.forwarder.utils.TASK_ACTION_HTTPSERVER import com.idormy.sms.forwarder.utils.TASK_ACTION_NOTIFICATION +import com.idormy.sms.forwarder.utils.TASK_ACTION_RESEND import com.idormy.sms.forwarder.utils.TASK_ACTION_RULE import com.idormy.sms.forwarder.utils.TASK_ACTION_SENDER import com.idormy.sms.forwarder.utils.TASK_ACTION_SENDSMS @@ -61,6 +63,8 @@ class TaskUtils private constructor() { TASK_ACTION_HTTPSERVER -> R.drawable.auto_task_icon_http_server TASK_ACTION_RULE -> R.drawable.auto_task_icon_rule TASK_ACTION_SENDER -> R.drawable.auto_task_icon_sender + TASK_ACTION_ALARM -> R.drawable.auto_task_icon_alarm + TASK_ACTION_RESEND -> R.drawable.auto_task_icon_resend else -> R.drawable.auto_task_icon_custom_time } } @@ -84,6 +88,8 @@ class TaskUtils private constructor() { TASK_ACTION_HTTPSERVER -> R.drawable.auto_task_icon_http_server_grey TASK_ACTION_RULE -> R.drawable.auto_task_icon_rule_grey TASK_ACTION_SENDER -> R.drawable.auto_task_icon_sender_grey + TASK_ACTION_ALARM -> R.drawable.auto_task_icon_alarm_grey + TASK_ACTION_RESEND -> R.drawable.auto_task_icon_resend_grey else -> R.drawable.auto_task_icon_custom_time_grey } } diff --git a/app/src/main/java/com/idormy/sms/forwarder/workers/ActionWorker.kt b/app/src/main/java/com/idormy/sms/forwarder/workers/ActionWorker.kt index cbe94e90..d0cb8698 100644 --- a/app/src/main/java/com/idormy/sms/forwarder/workers/ActionWorker.kt +++ b/app/src/main/java/com/idormy/sms/forwarder/workers/ActionWorker.kt @@ -20,6 +20,7 @@ import com.idormy.sms.forwarder.entity.action.AlarmSetting import com.idormy.sms.forwarder.entity.action.CleanerSetting import com.idormy.sms.forwarder.entity.action.FrpcSetting import com.idormy.sms.forwarder.entity.action.HttpServerSetting +import com.idormy.sms.forwarder.entity.action.ResendSetting import com.idormy.sms.forwarder.entity.action.RuleSetting import com.idormy.sms.forwarder.entity.action.SenderSetting import com.idormy.sms.forwarder.entity.action.SettingsSetting @@ -43,6 +44,7 @@ import com.idormy.sms.forwarder.utils.TASK_ACTION_CLEANER import com.idormy.sms.forwarder.utils.TASK_ACTION_FRPC import com.idormy.sms.forwarder.utils.TASK_ACTION_HTTPSERVER import com.idormy.sms.forwarder.utils.TASK_ACTION_NOTIFICATION +import com.idormy.sms.forwarder.utils.TASK_ACTION_RESEND import com.idormy.sms.forwarder.utils.TASK_ACTION_RULE import com.idormy.sms.forwarder.utils.TASK_ACTION_SENDER import com.idormy.sms.forwarder.utils.TASK_ACTION_SENDSMS @@ -322,6 +324,23 @@ class ActionWorker(context: Context, params: WorkerParameters) : CoroutineWorker writeLog(String.format(getString(R.string.successful_execution), alarmSetting.description), "SUCCESS") } + TASK_ACTION_RESEND -> { + val resendSetting = Gson().fromJson(action.setting, ResendSetting::class.java) + if (resendSetting == null) { + writeLog("resendSetting is null") + continue + } + + val logsList = Core.logs.getIdsByTimeAndStatus(resendSetting.hours, resendSetting.statusList) + logsList.forEach { item -> + Log.d(TAG, "resend logsList item: $item") + SendUtils.retrySendMsg(item.id) + } + + successNum++ + writeLog(String.format(getString(R.string.successful_execution), resendSetting.description), "SUCCESS") + } + else -> { writeLog("action.type is ${action.type}") } diff --git a/app/src/main/res/drawable/auto_task_icon_resend.xml b/app/src/main/res/drawable/auto_task_icon_resend.xml new file mode 100644 index 00000000..7228e97c --- /dev/null +++ b/app/src/main/res/drawable/auto_task_icon_resend.xml @@ -0,0 +1,20 @@ + + + + + + + diff --git a/app/src/main/res/drawable/auto_task_icon_resend_grey.xml b/app/src/main/res/drawable/auto_task_icon_resend_grey.xml new file mode 100644 index 00000000..0b970407 --- /dev/null +++ b/app/src/main/res/drawable/auto_task_icon_resend_grey.xml @@ -0,0 +1,20 @@ + + + + + + + diff --git a/app/src/main/res/layout/fragment_settings.xml b/app/src/main/res/layout/fragment_settings.xml index 186d21f0..8a5e8d83 100644 --- a/app/src/main/res/layout/fragment_settings.xml +++ b/app/src/main/res/layout/fragment_settings.xml @@ -681,7 +681,6 @@ diff --git a/app/src/main/res/layout/fragment_tasks_action_cleaner.xml b/app/src/main/res/layout/fragment_tasks_action_cleaner.xml index a02c9906..31150d3e 100644 --- a/app/src/main/res/layout/fragment_tasks_action_cleaner.xml +++ b/app/src/main/res/layout/fragment_tasks_action_cleaner.xml @@ -56,38 +56,22 @@ android:layout_marginBottom="5dp" android:background="?attr/xui_config_color_separator_light" /> - - - - - - - + app:xsb_insideRangeLineColor="#0bd97f" + app:xsb_insideRangeLineStrokeWidth="10dp" + app:xsb_isShowBubble="true" + app:xsb_isShowRuler="true" + app:xsb_max="60" + app:xsb_min="0" + app:xsb_numberTextColor="#ffffff" + app:xsb_numberTextSize="@dimen/text_size_small" + app:xsb_outsideRangeLineColor="#f0f0f0" + app:xsb_outsideRangeLineStrokeWidth="10dp" + app:xsb_rulerColor="@color/xui_config_color_gray_4" + app:xsb_rulerInterval="ten" /> diff --git a/app/src/main/res/layout/fragment_tasks_action_resend.xml b/app/src/main/res/layout/fragment_tasks_action_resend.xml new file mode 100644 index 00000000..e9b15b2c --- /dev/null +++ b/app/src/main/res/layout/fragment_tasks_action_resend.xml @@ -0,0 +1,177 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ 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 1394f488..582abc13 100644 --- a/app/src/main/res/values-en/strings.xml +++ b/app/src/main/res/values-en/strings.xml @@ -604,6 +604,7 @@ Rule: Time: Result: + Original Result: success failed In the processing… @@ -1193,6 +1194,7 @@ Manage HttpServer start/stop and enable/disable functions Cleaner Delete FW. logs older than N days, delete cache, etc. + Delete FW. logs older than %s days, delete cache, etc. Settings Control the configuration switch of "Settings". Rules On/Off @@ -1201,6 +1203,10 @@ Control enabling/disabling of "Senders" Alarm Alarm + Resend Message + Resend forwarded records since N hours ago, 0=ALL + Resend forwarding records since %s hours ago for %s + At least one "Original Result" must be selected Second Minute diff --git a/app/src/main/res/values-zh-rCN/strings.xml b/app/src/main/res/values-zh-rCN/strings.xml index 37f574fc..41568f0c 100644 --- a/app/src/main/res/values-zh-rCN/strings.xml +++ b/app/src/main/res/values-zh-rCN/strings.xml @@ -605,6 +605,7 @@ 规则: 时间: 转发结果: + 原转发状态: 成功 失败 处理中 @@ -1194,6 +1195,7 @@ 控制HttpServer的启动/停止,并支持启用/禁用功能 清理日志 批量删除N天前的转发记录、删除缓存等 + 批量删除N天前的转发记录、删除缓存等 通用设置 控制【通用设置】的配置开关 启停规则 @@ -1202,6 +1204,10 @@ 控制【发送通道】的启用/禁用 声音警报 声音警报 + 重发消息 + 自动重发N小时以来的转发记录,0=全部 + 自动重发%s小时以来%s的转发记录 + 必须至少选择一个【原转发状态】 diff --git a/app/src/main/res/values-zh-rTW/strings.xml b/app/src/main/res/values-zh-rTW/strings.xml index 54ea307a..ac68c90a 100644 --- a/app/src/main/res/values-zh-rTW/strings.xml +++ b/app/src/main/res/values-zh-rTW/strings.xml @@ -605,6 +605,7 @@ 規則: 時間: 轉發結果: + 原轉發狀態: 成功 失敗 處理中 @@ -1194,6 +1195,7 @@ 控制HttpServer的啟動/停止,並支持啟用/禁用功能 清理日誌 批量刪除N天前的轉發記錄、刪除快取等 + 批量刪除N天前的轉發記錄、刪除快取等 通用設置 控制「通用設置」的設定開關 啟停規則 @@ -1202,6 +1204,10 @@ 控制【發送通道】的啟用/禁用 聲音警報 聲音警報 + 重發消息 + 自動重發N小時以來的轉發記錄,0=全部 + 自動重發%s小時以來%s的轉發記錄 + 必须至少选择一個「原轉發狀態」 diff --git a/app/src/main/res/values/strings.xml b/app/src/main/res/values/strings.xml index 6c549cb0..9fec3ba0 100644 --- a/app/src/main/res/values/strings.xml +++ b/app/src/main/res/values/strings.xml @@ -605,6 +605,7 @@ 规则: 时间: 转发结果: + 原转发状态: 成功 失败 处理中 @@ -1194,6 +1195,7 @@ 控制HttpServer的启动/停止,并支持启用/禁用功能 清理日志 批量删除N天前的转发记录、删除缓存等 + 批量删除N天前的转发记录、删除缓存等 通用设置 控制【通用设置】的配置开关 启停规则 @@ -1202,6 +1204,10 @@ 控制【发送通道】的启用/禁用 声音警报 播放音乐提醒 + 重发消息 + 自动重发N小时以来的转发记录,0=全部 + 自动重发%s小时以来%s的转发记录 + 必须至少选择一个【原转发状态】