From 2d787fbdc07a9bbd9e190bf027088a362e2a03ab Mon Sep 17 00:00:00 2001 From: pppscn <35696959@qq.com> Date: Sun, 19 Jun 2022 15:23:19 +0800 Subject: [PATCH] =?UTF-8?q?=E6=96=B0=E5=A2=9E=EF=BC=9A=E5=85=8D=E6=89=93?= =?UTF-8?q?=E6=89=B0(=E7=A6=81=E7=94=A8=E8=BD=AC=E5=8F=91)=E6=97=B6?= =?UTF-8?q?=E9=97=B4=E6=AE=B5?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../forwarder/fragment/SettingsFragment.kt | 21 ++++++++ .../idormy/sms/forwarder/utils/Constants.kt | 2 + .../sms/forwarder/utils/DataProvider.kt | 29 ++++++++++ .../sms/forwarder/utils/SettingUtils.kt | 16 ++++++ .../sms/forwarder/workers/SendWorker.kt | 37 +++++++++++-- app/src/main/res/layout/fragment_settings.xml | 54 +++++++++++++++++++ app/src/main/res/values-en/strings.xml | 3 ++ app/src/main/res/values/strings.xml | 3 ++ 8 files changed, 161 insertions(+), 4 deletions(-) diff --git a/app/src/main/java/com/idormy/sms/forwarder/fragment/SettingsFragment.kt b/app/src/main/java/com/idormy/sms/forwarder/fragment/SettingsFragment.kt index 7fc983f9..1b098260 100644 --- a/app/src/main/java/com/idormy/sms/forwarder/fragment/SettingsFragment.kt +++ b/app/src/main/java/com/idormy/sms/forwarder/fragment/SettingsFragment.kt @@ -41,7 +41,9 @@ import com.xuexiang.xui.widget.dialog.materialdialog.MaterialDialog import com.xuexiang.xui.widget.picker.XRangeSlider import com.xuexiang.xui.widget.picker.XRangeSlider.OnRangeSliderListener import com.xuexiang.xui.widget.picker.XSeekBar +import com.xuexiang.xui.widget.picker.widget.builder.OptionsPickerBuilder import com.xuexiang.xui.widget.picker.widget.builder.TimePickerBuilder +import com.xuexiang.xui.widget.picker.widget.listener.OnOptionsSelectListener import com.xuexiang.xutil.XUtil import com.xuexiang.xutil.XUtil.getPackageManager import com.xuexiang.xutil.app.AppUtils.getAppPackageName @@ -54,6 +56,7 @@ import java.util.* class SettingsFragment : BaseFragment(), View.OnClickListener { val TAG: String = SettingsFragment::class.java.simpleName + private val mTimeOption = DataProvider.timePeriodOption override fun viewBindingInflate( inflater: LayoutInflater, @@ -85,6 +88,8 @@ class SettingsFragment : BaseFragment(), View.OnClickL binding!!.xsbDuplicateMessagesLimits.setOnSeekBarListener { _: XSeekBar?, newValue: Int -> SettingUtils.duplicateMessagesLimits = newValue } + //免打扰(禁用转发)时间段 + binding!!.tvSilentPeriod.text = mTimeOption[SettingUtils.silentPeriodStart] + " ~ " + mTimeOption[SettingUtils.silentPeriodEnd] //监听电池状态变化 switchBatteryReceiver(binding!!.sbBatteryReceiver) @@ -130,6 +135,7 @@ class SettingsFragment : BaseFragment(), View.OnClickL } override fun initListeners() { + binding!!.btnSilentPeriod.setOnClickListener(this) binding!!.btnExtraDeviceMark.setOnClickListener(this) binding!!.btnExtraSim1.setOnClickListener(this) binding!!.btnExtraSim2.setOnClickListener(this) @@ -145,6 +151,21 @@ class SettingsFragment : BaseFragment(), View.OnClickL override fun onClick(v: View) { val etSmsTemplate: EditText = binding!!.etSmsTemplate when (v.id) { + R.id.btn_silent_period -> { + OptionsPickerBuilder(context, OnOptionsSelectListener { _: View?, options1: Int, options2: Int, _: Int -> + SettingUtils.silentPeriodStart = options1 + SettingUtils.silentPeriodEnd = options2 + val txt = mTimeOption[options1] + " ~ " + mTimeOption[options2] + binding!!.tvSilentPeriod.text = txt + XToastUtils.toast(txt) + return@OnOptionsSelectListener false + }).setTitleText(getString(R.string.select_time_period)) + .setSelectOptions(SettingUtils.silentPeriodStart, SettingUtils.silentPeriodEnd) + .build().also { + it.setNPicker(mTimeOption, mTimeOption) + it.show() + } + } R.id.btn_extra_device_mark -> { binding!!.etExtraDeviceMark.setText(PhoneUtils.getDeviceName()) return 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 b8ce8372..d1890760 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 @@ -39,6 +39,8 @@ const val ENABLE_LOAD_USER_APP_LIST = "enable_load_user_app_list" const val ENABLE_LOAD_SYSTEM_APP_LIST = "enable_load_system_app_list" const val SP_DUPLICATE_MESSAGES_LIMITS = "duplicate_messages_limits" +const val SP_SILENT_PERIOD_START = "silent_period_start" +const val SP_SILENT_PERIOD_END = "silent_period_end" const val SP_BATTERY_RECEIVER = "enable_battery_receiver" const val SP_BATTERY_STATUS = "battery_status" diff --git a/app/src/main/java/com/idormy/sms/forwarder/utils/DataProvider.kt b/app/src/main/java/com/idormy/sms/forwarder/utils/DataProvider.kt index 31b62e3e..1a0ca8f5 100644 --- a/app/src/main/java/com/idormy/sms/forwarder/utils/DataProvider.kt +++ b/app/src/main/java/com/idormy/sms/forwarder/utils/DataProvider.kt @@ -42,4 +42,33 @@ object DataProvider { } return list } + + //获取时间段 + @JvmStatic + @get:MemoryCache + val timePeriodOption: List + get() { + return getTimePeriod(24, 10) //修改时请注意会不会造成旧版下标越界 + } + + /** + * 获取时间段 + * + * @param interval 时间间隔(分钟) + * @return + */ + @Suppress("UNCHECKED_CAST") + fun getTimePeriod(totalHour: Int, interval: Int): List { + val list: MutableList = ArrayList() + var point: Int + var hour: Int + var min: Int + for (i in 0..totalHour * 60 / interval) { + point = i * interval + hour = point / 60 + min = point - hour * 60 + list.add((if (hour <= 9) "0$hour" else "" + hour) + ":" + if (min <= 9) "0$min" else "" + min) + } + return list + } } \ No newline at end of file diff --git a/app/src/main/java/com/idormy/sms/forwarder/utils/SettingUtils.kt b/app/src/main/java/com/idormy/sms/forwarder/utils/SettingUtils.kt index 1729a631..cd42544a 100644 --- a/app/src/main/java/com/idormy/sms/forwarder/utils/SettingUtils.kt +++ b/app/src/main/java/com/idormy/sms/forwarder/utils/SettingUtils.kt @@ -117,6 +117,22 @@ class SettingUtils private constructor() { MMKVUtils.put(SP_DUPLICATE_MESSAGES_LIMITS, duplicateMessagesLimits) } + //免打扰(禁用转发)时间段——开始 + @JvmStatic + var silentPeriodStart: Int + get() = MMKVUtils.getInt(SP_SILENT_PERIOD_START, 0) + set(silentPeriodStart) { + MMKVUtils.put(SP_SILENT_PERIOD_START, silentPeriodStart) + } + + //免打扰(禁用转发)时间段——结束 + @JvmStatic + var silentPeriodEnd: Int + get() = MMKVUtils.getInt(SP_SILENT_PERIOD_END, 0) + set(silentPeriodEnd) { + MMKVUtils.put(SP_SILENT_PERIOD_END, silentPeriodEnd) + } + //是否监听电池状态变化 @JvmStatic var enableBatteryReceiver: Boolean diff --git a/app/src/main/java/com/idormy/sms/forwarder/workers/SendWorker.kt b/app/src/main/java/com/idormy/sms/forwarder/workers/SendWorker.kt index 7bdf90dd..39dacdb5 100644 --- a/app/src/main/java/com/idormy/sms/forwarder/workers/SendWorker.kt +++ b/app/src/main/java/com/idormy/sms/forwarder/workers/SendWorker.kt @@ -10,13 +10,13 @@ import com.idormy.sms.forwarder.core.Core import com.idormy.sms.forwarder.database.entity.Logs import com.idormy.sms.forwarder.database.entity.RuleAndSender import com.idormy.sms.forwarder.entity.MsgInfo -import com.idormy.sms.forwarder.utils.HistoryUtils -import com.idormy.sms.forwarder.utils.SendUtils -import com.idormy.sms.forwarder.utils.SettingUtils -import com.idormy.sms.forwarder.utils.Worker +import com.idormy.sms.forwarder.utils.* import com.xuexiang.xutil.security.CipherUtils import kotlinx.coroutines.Dispatchers import kotlinx.coroutines.withContext +import java.text.ParsePosition +import java.text.SimpleDateFormat +import java.util.* class SendWorker( context: Context, @@ -27,6 +27,35 @@ class SendWorker( return withContext(Dispatchers.IO) { try { + // 免打扰(禁用转发)时间段 + if (SettingUtils.silentPeriodStart != SettingUtils.silentPeriodEnd) { + val periodStartDay = Date() + var periodStartEnd = Date() + //跨天了 + if (SettingUtils.silentPeriodStart > SettingUtils.silentPeriodEnd) { + val c: Calendar = Calendar.getInstance() + c.time = periodStartEnd + c.add(Calendar.DAY_OF_MONTH, 1) + periodStartEnd = c.time + } + + val dateFmt = SimpleDateFormat("yyyy-MM-dd") + val mTimeOption = DataProvider.timePeriodOption + val periodStartStr = dateFmt.format(periodStartDay) + " " + mTimeOption[SettingUtils.silentPeriodStart] + ":00" + val periodEndStr = dateFmt.format(periodStartEnd) + " " + mTimeOption[SettingUtils.silentPeriodEnd] + ":00" + + val timeFmt = SimpleDateFormat("yyyy-MM-dd HH:mm:ss") + val periodStart = timeFmt.parse(periodStartStr, ParsePosition(0)).time + val periodEnd = timeFmt.parse(periodEndStr, ParsePosition(0)).time + + val now = System.currentTimeMillis() + if (now in periodStart..periodEnd) { + Log.e("SendWorker", "免打扰(禁用转发)时间段") + return@withContext Result.failure(workDataOf("send" to "failed")) + } + + } + val msgInfoJson = inputData.getString(Worker.sendMsgInfo) val msgInfo = Gson().fromJson(msgInfoJson, MsgInfo::class.java) diff --git a/app/src/main/res/layout/fragment_settings.xml b/app/src/main/res/layout/fragment_settings.xml index 8e347a47..06fefc35 100644 --- a/app/src/main/res/layout/fragment_settings.xml +++ b/app/src/main/res/layout/fragment_settings.xml @@ -371,6 +371,60 @@ + + + + + + + + + + + + + + + + Used to speed up entering the application list/editing forwarding rules drop-down selection/replacement {{APP_NAME}} A type must be selected when enabling asynchronous loading of the list of installed apps There is no history record, it will be added automatically after the interface test is passed + Select Time Period + Silent (disable forwarding) time period + If the end time is less than the start time, it will span days; if it is equal, it will be disabled diff --git a/app/src/main/res/values/strings.xml b/app/src/main/res/values/strings.xml index f46dec3a..434c2f4f 100644 --- a/app/src/main/res/values/strings.xml +++ b/app/src/main/res/values/strings.xml @@ -870,4 +870,7 @@ 用于加速进入应用列表/编辑转发规则下拉选择/替换{{APP名称}} 开启异步获取已安装App列表时必选一个类型 暂无历史记录,接口测试通过后自动加入 + 时间段选择 + 免打扰(禁用转发)时间段 + 结束时间小于开始时间则跨天;相等则禁用