From 66e324bbbba8bdb0f8025ae7f4be3b567482e818 Mon Sep 17 00:00:00 2001 From: pppscn <35696959@qq.com> Date: Thu, 22 Sep 2022 15:58:18 +0800 Subject: [PATCH] =?UTF-8?q?=E6=96=B0=E5=A2=9E=EF=BC=9A=E8=87=AA=E5=8A=A8?= =?UTF-8?q?=E5=88=A0=E9=99=A4N=E5=A4=A9=E5=89=8D=E7=9A=84=E8=BD=AC?= =?UTF-8?q?=E5=8F=91=E8=AE=B0=E5=BD=95=EF=BC=880=3D=E7=A6=81=E7=94=A8?= =?UTF-8?q?=EF=BC=8C=E8=A7=A6=E5=8F=91=E6=9C=BA=E5=88=B6=EF=BC=9A=E6=AF=8F?= =?UTF-8?q?=E6=AC=A1=E7=94=B5=E9=87=8F=E5=8F=98=E5=8C=96=E6=97=B6=E6=89=AB?= =?UTF-8?q?=E6=8F=8F=EF=BC=89=20#224?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../sms/forwarder/database/AppDatabase.kt | 15 +- .../sms/forwarder/database/dao/LogsDao.kt | 3 + .../database/repository/LogsRepository.kt | 8 +- .../forwarder/fragment/SettingsFragment.kt | 161 +++++++++++++---- .../sms/forwarder/service/BatteryService.kt | 21 ++- .../idormy/sms/forwarder/utils/Constants.kt | 169 +++++++++++++++--- .../sms/forwarder/utils/SettingUtils.kt | 8 + app/src/main/res/layout/fragment_settings.xml | 47 +++++ app/src/main/res/values-en/strings.xml | 5 +- app/src/main/res/values/strings.xml | 5 +- 10 files changed, 378 insertions(+), 64 deletions(-) diff --git a/app/src/main/java/com/idormy/sms/forwarder/database/AppDatabase.kt b/app/src/main/java/com/idormy/sms/forwarder/database/AppDatabase.kt index 147ddc36..f658b0d9 100644 --- a/app/src/main/java/com/idormy/sms/forwarder/database/AppDatabase.kt +++ b/app/src/main/java/com/idormy/sms/forwarder/database/AppDatabase.kt @@ -7,6 +7,7 @@ import androidx.room.RoomDatabase import androidx.room.TypeConverters import androidx.room.migration.Migration import androidx.sqlite.db.SupportSQLiteDatabase +import com.idormy.sms.forwarder.BuildConfig import com.idormy.sms.forwarder.database.dao.FrpcDao import com.idormy.sms.forwarder.database.dao.LogsDao import com.idormy.sms.forwarder.database.dao.RuleDao @@ -43,7 +44,11 @@ abstract class AppDatabase : RoomDatabase() { } private fun buildDatabase(context: Context): AppDatabase { - return Room.databaseBuilder(context.applicationContext, AppDatabase::class.java, DATABASE_NAME) + var builder = Room.databaseBuilder( + context.applicationContext, + AppDatabase::class.java, + DATABASE_NAME + ) .allowMainThreadQueries() //TODO:允许主线程访问,后面再优化 .addCallback(object : RoomDatabase.Callback() { override fun onCreate(db: SupportSQLiteDatabase) { @@ -93,10 +98,14 @@ custom_domains = smsf.demo.com MIGRATION_8_9, MIGRATION_9_10, ) - .setQueryCallback({ sqlQuery, bindArgs -> + + if (BuildConfig.DEBUG) { + builder.setQueryCallback({ sqlQuery, bindArgs -> println("SQL_QUERY: $sqlQuery\nBIND_ARGS: $bindArgs") }, Executors.newSingleThreadExecutor()) - .build() + } + + return builder.build() } //转发日志添加SIM卡槽信息 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 101168b9..129c18c3 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 @@ -22,6 +22,9 @@ interface LogsDao { @Query("DELETE FROM Logs where type=:type") fun deleteAll(type: String): Completable + @Query("DELETE FROM Logs where time<:time") + fun deleteTimeAgo(time: Long) + @Update fun update(logs: Logs): Completable 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 003b2391..8449b71a 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 @@ -11,9 +11,15 @@ class LogsRepository(private val logsDao: LogsDao) { logsDao.delete(id) } + @WorkerThread + fun deleteTimeAgo(time: Long) { + logsDao.deleteTimeAgo(time) + } + @WorkerThread suspend fun insert(logs: Logs): Long = logsDao.insert(logs) @WorkerThread - fun updateStatus(id: Long, status: Int, response: String): Int = logsDao.updateStatus(id, status, response) + fun updateStatus(id: Long, status: Int, response: String): Int = + logsDao.updateStatus(id, status, response) } \ No newline at end of file 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 3936b9e2..5eb7b67a 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 @@ -78,18 +78,38 @@ class SettingsFragment : BaseFragment(), View.OnClickL //转发短信广播 switchEnableSms(binding!!.sbEnableSms) //转发通话记录 - switchEnablePhone(binding!!.sbEnablePhone, binding!!.scbCallType1, binding!!.scbCallType2, binding!!.scbCallType3, binding!!.scbCallType4) + switchEnablePhone( + binding!!.sbEnablePhone, + binding!!.scbCallType1, + binding!!.scbCallType2, + binding!!.scbCallType3, + binding!!.scbCallType4 + ) //转发应用通知 - switchEnableAppNotify(binding!!.sbEnableAppNotify, binding!!.scbCancelAppNotify, binding!!.scbNotUserPresent) + switchEnableAppNotify( + binding!!.sbEnableAppNotify, + binding!!.scbCancelAppNotify, + binding!!.scbNotUserPresent + ) //启动时异步获取已安装App信息 - switchEnableLoadAppList(binding!!.sbEnableLoadAppList, binding!!.scbLoadUserApp, binding!!.scbLoadSystemApp) + switchEnableLoadAppList( + binding!!.sbEnableLoadAppList, + binding!!.scbLoadUserApp, + binding!!.scbLoadSystemApp + ) //过滤多久内重复消息 binding!!.xsbDuplicateMessagesLimits.setDefaultValue(SettingUtils.duplicateMessagesLimits) binding!!.xsbDuplicateMessagesLimits.setOnSeekBarListener { _: XSeekBar?, newValue: Int -> SettingUtils.duplicateMessagesLimits = newValue } //免打扰(禁用转发)时间段 - binding!!.tvSilentPeriod.text = mTimeOption[SettingUtils.silentPeriodStart] + " ~ " + mTimeOption[SettingUtils.silentPeriodEnd] + binding!!.tvSilentPeriod.text = + mTimeOption[SettingUtils.silentPeriodStart] + " ~ " + mTimeOption[SettingUtils.silentPeriodEnd] + //自动删除N天前的转发记录 + binding!!.xsbAutoCleanLogs.setDefaultValue(SettingUtils.autoCleanLogsDays) + binding!!.xsbAutoCleanLogs.setOnSeekBarListener { _: XSeekBar?, newValue: Int -> + SettingUtils.autoCleanLogsDays = newValue + } //监听电池状态变化 switchBatteryReceiver(binding!!.sbBatteryReceiver) @@ -108,7 +128,11 @@ class SettingsFragment : BaseFragment(), View.OnClickL switchExcludeFromRecents(binding!!.layoutExcludeFromRecents, binding!!.sbExcludeFromRecents) //Cactus增强保活措施 - switchEnableCactus(binding!!.sbEnableCactus, binding!!.scbPlaySilenceMusic, binding!!.scbOnePixelActivity) + switchEnableCactus( + binding!!.sbEnableCactus, + binding!!.scbPlaySilenceMusic, + binding!!.scbOnePixelActivity + ) //接口请求失败重试时间间隔 editRetryDelayTime(binding!!.etRetryTimes, binding!!.etDelayTime, binding!!.etTimeout) @@ -152,14 +176,16 @@ class SettingsFragment : BaseFragment(), View.OnClickL 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)) + 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) @@ -178,7 +204,12 @@ class SettingsFragment : BaseFragment(), View.OnClickL } Log.d(TAG, App.SimInfoList.toString()) if (!App.SimInfoList.containsKey(0)) { - XToastUtils.error(String.format(getString(R.string.tip_can_not_get_sim_info), 1)) + XToastUtils.error( + String.format( + getString(R.string.tip_can_not_get_sim_info), + 1 + ) + ) return } val simInfo: SimInfo? = App.SimInfoList[0] @@ -193,7 +224,12 @@ class SettingsFragment : BaseFragment(), View.OnClickL } Log.d(TAG, App.SimInfoList.toString()) if (!App.SimInfoList.containsKey(1)) { - XToastUtils.error(String.format(getString(R.string.tip_can_not_get_sim_info), 2)) + XToastUtils.error( + String.format( + getString(R.string.tip_can_not_get_sim_info), + 2 + ) + ) return } val simInfo: SimInfo? = App.SimInfoList[1] @@ -209,15 +245,24 @@ class SettingsFragment : BaseFragment(), View.OnClickL return } R.id.bt_insert_extra -> { - CommonUtils.insertOrReplaceText2Cursor(etSmsTemplate, getString(R.string.tag_card_slot)) + CommonUtils.insertOrReplaceText2Cursor( + etSmsTemplate, + getString(R.string.tag_card_slot) + ) return } R.id.bt_insert_time -> { - CommonUtils.insertOrReplaceText2Cursor(etSmsTemplate, getString(R.string.tag_receive_time)) + CommonUtils.insertOrReplaceText2Cursor( + etSmsTemplate, + getString(R.string.tag_receive_time) + ) return } R.id.bt_insert_device_name -> { - CommonUtils.insertOrReplaceText2Cursor(etSmsTemplate, getString(R.string.tag_device_name)) + CommonUtils.insertOrReplaceText2Cursor( + etSmsTemplate, + getString(R.string.tag_device_name) + ) return } else -> {} @@ -266,7 +311,13 @@ class SettingsFragment : BaseFragment(), View.OnClickL //转发通话 @SuppressLint("UseSwitchCompatOrMaterialCode") - fun switchEnablePhone(sbEnablePhone: SwitchButton, scbCallType1: SmoothCheckBox, scbCallType2: SmoothCheckBox, scbCallType3: SmoothCheckBox, scbCallType4: SmoothCheckBox) { + fun switchEnablePhone( + sbEnablePhone: SwitchButton, + scbCallType1: SmoothCheckBox, + scbCallType2: SmoothCheckBox, + scbCallType3: SmoothCheckBox, + scbCallType4: SmoothCheckBox + ) { sbEnablePhone.isChecked = SettingUtils.enablePhone scbCallType1.isChecked = SettingUtils.enableCallType1 scbCallType2.isChecked = SettingUtils.enableCallType2 @@ -350,7 +401,11 @@ class SettingsFragment : BaseFragment(), View.OnClickL //转发应用通知 @SuppressLint("UseSwitchCompatOrMaterialCode") - fun switchEnableAppNotify(sbEnableAppNotify: SwitchButton, scbCancelAppNotify: SmoothCheckBox, scbNotUserPresent: SmoothCheckBox) { + fun switchEnableAppNotify( + sbEnableAppNotify: SwitchButton, + scbCancelAppNotify: SmoothCheckBox, + scbNotUserPresent: SmoothCheckBox + ) { val layoutOptionalAction: LinearLayout = binding!!.layoutOptionalAction val isEnable: Boolean = SettingUtils.enableAppNotify sbEnableAppNotify.isChecked = isEnable @@ -383,7 +438,10 @@ class SettingsFragment : BaseFragment(), View.OnClickL .positiveText(R.string.lab_yes) .negativeText(R.string.lab_no) .onPositive { _: MaterialDialog?, _: DialogAction? -> - XXPermissions.startPermissionActivity(requireContext(), permissions) + XXPermissions.startPermissionActivity( + requireContext(), + permissions + ) } .show() } @@ -402,7 +460,11 @@ class SettingsFragment : BaseFragment(), View.OnClickL //启动时异步获取已安装App信息 (binding!!.sbEnableLoadAppList, binding!!.scbLoadUserApp, binding!!.scbLoadSystemApp) @SuppressLint("UseSwitchCompatOrMaterialCode") - fun switchEnableLoadAppList(sbEnableLoadAppList: SwitchButton, scbLoadUserApp: SmoothCheckBox, scbLoadSystemApp: SmoothCheckBox) { + fun switchEnableLoadAppList( + sbEnableLoadAppList: SwitchButton, + scbLoadUserApp: SmoothCheckBox, + scbLoadSystemApp: SmoothCheckBox + ) { val isEnable: Boolean = SettingUtils.enableLoadAppList sbEnableLoadAppList.isChecked = isEnable @@ -445,8 +507,14 @@ class SettingsFragment : BaseFragment(), View.OnClickL } //设置低电量报警 - private fun editBatteryLevelAlarm(xrsBatteryLevelAlarm: XRangeSlider, scbBatteryLevelAlarmOnce: SmoothCheckBox) { - xrsBatteryLevelAlarm.setStartingMinMax(SettingUtils.batteryLevelMin, SettingUtils.batteryLevelMax) + private fun editBatteryLevelAlarm( + xrsBatteryLevelAlarm: XRangeSlider, + scbBatteryLevelAlarmOnce: SmoothCheckBox + ) { + xrsBatteryLevelAlarm.setStartingMinMax( + SettingUtils.batteryLevelMin, + SettingUtils.batteryLevelMax + ) xrsBatteryLevelAlarm.setOnRangeSliderListener(object : OnRangeSliderListener { override fun onMaxChanged(slider: XRangeSlider, maxValue: Int) { //SettingUtils.batteryLevelMin = slider.selectedMin @@ -472,7 +540,8 @@ class SettingsFragment : BaseFragment(), View.OnClickL @SuppressLint("UseSwitchCompatOrMaterialCode") fun switchBatteryCron(sbBatteryCron: SwitchButton) { sbBatteryCron.isChecked = SettingUtils.enableBatteryCron - binding!!.layoutBatteryCron.visibility = if (SettingUtils.enableBatteryCron) View.VISIBLE else View.GONE + binding!!.layoutBatteryCron.visibility = + if (SettingUtils.enableBatteryCron) View.VISIBLE else View.GONE sbBatteryCron.setOnCheckedChangeListener { _: CompoundButton?, isChecked: Boolean -> binding!!.layoutBatteryCron.visibility = if (isChecked) View.VISIBLE else View.GONE SettingUtils.enableBatteryCron = isChecked @@ -482,7 +551,10 @@ class SettingsFragment : BaseFragment(), View.OnClickL } //设置推送电池状态时机 - private fun editBatteryCronTiming(etBatteryCronStartTime: EditText, etBatteryCronInterval: EditText) { + private fun editBatteryCronTiming( + etBatteryCronStartTime: EditText, + etBatteryCronInterval: EditText + ) { etBatteryCronStartTime.setText(SettingUtils.batteryCronStartTime) etBatteryCronStartTime.setOnClickListener { val calendar = Calendar.getInstance() @@ -520,17 +592,22 @@ class SettingsFragment : BaseFragment(), View.OnClickL } //开机启动 - private fun checkWithReboot(@SuppressLint("UseSwitchCompatOrMaterialCode") sbWithReboot: SwitchButton, tvAutoStartup: TextView) { + private fun checkWithReboot( + @SuppressLint("UseSwitchCompatOrMaterialCode") sbWithReboot: SwitchButton, + tvAutoStartup: TextView + ) { tvAutoStartup.text = getAutoStartTips() //获取组件 val cm = ComponentName(getAppPackageName(), BootReceiver::class.java.name) val pm: PackageManager = getPackageManager() val state = pm.getComponentEnabledSetting(cm) - sbWithReboot.isChecked = (state != PackageManager.COMPONENT_ENABLED_STATE_DISABLED && state != PackageManager.COMPONENT_ENABLED_STATE_DISABLED_USER) + sbWithReboot.isChecked = + (state != PackageManager.COMPONENT_ENABLED_STATE_DISABLED && state != PackageManager.COMPONENT_ENABLED_STATE_DISABLED_USER) sbWithReboot.setOnCheckedChangeListener { _: CompoundButton?, isChecked: Boolean -> try { - val newState = if (isChecked) PackageManager.COMPONENT_ENABLED_STATE_ENABLED else PackageManager.COMPONENT_ENABLED_STATE_DISABLED + val newState = + if (isChecked) PackageManager.COMPONENT_ENABLED_STATE_ENABLED else PackageManager.COMPONENT_ENABLED_STATE_DISABLED pm.setComponentEnabledSetting(cm, newState, PackageManager.DONT_KILL_APP) if (isChecked) startToAutoStartSetting(requireContext()) } catch (e: Exception) { @@ -550,7 +627,8 @@ class SettingsFragment : BaseFragment(), View.OnClickL } try { - val isIgnoreBatteryOptimization: Boolean = KeepAliveUtils.isIgnoreBatteryOptimization(requireActivity()) + val isIgnoreBatteryOptimization: Boolean = + KeepAliveUtils.isIgnoreBatteryOptimization(requireActivity()) sbBatterySetting.isChecked = isIgnoreBatteryOptimization sbBatterySetting.setOnCheckedChangeListener { _: CompoundButton?, isChecked: Boolean -> if (isChecked && !isIgnoreBatteryOptimization) { @@ -570,7 +648,10 @@ class SettingsFragment : BaseFragment(), View.OnClickL //不在最近任务列表中显示 @SuppressLint("ObsoleteSdkInt,UseSwitchCompatOrMaterialCode") - fun switchExcludeFromRecents(layoutExcludeFromRecents: LinearLayout, sbExcludeFromRecents: SwitchButton) { + fun switchExcludeFromRecents( + layoutExcludeFromRecents: LinearLayout, + sbExcludeFromRecents: SwitchButton + ) { //安卓6.0以下没有不在最近任务列表中显示 if (Build.VERSION.SDK_INT < Build.VERSION_CODES.M) { layoutExcludeFromRecents.visibility = View.GONE @@ -593,7 +674,11 @@ class SettingsFragment : BaseFragment(), View.OnClickL //转发应用通知 @SuppressLint("UseSwitchCompatOrMaterialCode") - fun switchEnableCactus(sbEnableCactus: SwitchButton, scbPlaySilenceMusic: SmoothCheckBox, scbOnePixelActivity: SmoothCheckBox) { + fun switchEnableCactus( + sbEnableCactus: SwitchButton, + scbPlaySilenceMusic: SmoothCheckBox, + scbOnePixelActivity: SmoothCheckBox + ) { val layoutCactusOptional: LinearLayout = binding!!.layoutCactusOptional val isEnable: Boolean = SettingUtils.enableCactus sbEnableCactus.isChecked = isEnable @@ -622,7 +707,11 @@ class SettingsFragment : BaseFragment(), View.OnClickL } //接口请求失败重试时间间隔 - private fun editRetryDelayTime(etRetryTimes: EditText, etDelayTime: EditText, etTimeout: EditText) { + private fun editRetryDelayTime( + etRetryTimes: EditText, + etDelayTime: EditText, + etTimeout: EditText + ) { etRetryTimes.setText(java.lang.String.valueOf(SettingUtils.requestRetryTimes)) etRetryTimes.addTextChangedListener(object : TextWatcher { override fun beforeTextChanged(s: CharSequence, start: Int, count: Int, after: Int) {} @@ -721,7 +810,8 @@ class SettingsFragment : BaseFragment(), View.OnClickL override fun onTextChanged(s: CharSequence, start: Int, before: Int, count: Int) {} override fun afterTextChanged(s: Editable) { SettingUtils.notifyContent = etNotifyContent.text.toString().trim() - LiveEventBus.get(EVENT_UPDATE_NOTIFY, String::class.java).post(SettingUtils.notifyContent.toString()) + LiveEventBus.get(EVENT_UPDATE_NOTIFY, String::class.java) + .post(SettingUtils.notifyContent.toString()) } }) } @@ -971,7 +1061,8 @@ class SettingsFragment : BaseFragment(), View.OnClickL } else { //找不到? 网上的做法都是跳转到设置... 这基本上是没意义的 基本上自启动这个功能是第三方厂商自己写的安全管家类app //所以我是直接跳转到对应的安全管家/安全中心 - intent = act?.let { context.packageManager.getLaunchIntentForPackage(it) } + intent = + act?.let { context.packageManager.getLaunchIntentForPackage(it) } } context.startActivity(intent) has = true diff --git a/app/src/main/java/com/idormy/sms/forwarder/service/BatteryService.kt b/app/src/main/java/com/idormy/sms/forwarder/service/BatteryService.kt index 21be321c..78f1a996 100644 --- a/app/src/main/java/com/idormy/sms/forwarder/service/BatteryService.kt +++ b/app/src/main/java/com/idormy/sms/forwarder/service/BatteryService.kt @@ -13,6 +13,7 @@ import androidx.work.WorkManager import androidx.work.workDataOf import com.google.gson.Gson import com.idormy.sms.forwarder.R +import com.idormy.sms.forwarder.core.Core import com.idormy.sms.forwarder.entity.MsgInfo import com.idormy.sms.forwarder.utils.BatteryUtils import com.idormy.sms.forwarder.utils.SettingUtils @@ -58,6 +59,13 @@ class BatteryService : Service() { private val batteryReceiver: BroadcastReceiver = object : BroadcastReceiver() { @SuppressLint("DefaultLocale") override fun onReceive(context: Context, intent: Intent) { + //自动删除N天前的转发记录 + if (SettingUtils.autoCleanLogsDays > 0) { + Log.d(TAG, "自动删除N天前的转发记录") + val cal = Calendar.getInstance() + cal.add(Calendar.DAY_OF_MONTH, 0 - SettingUtils.autoCleanLogsDays) + Core.logs.deleteTimeAgo(cal.timeInMillis) + } //电量发生变化 val levelCur: Int = intent.getIntExtra("level", 0) @@ -93,7 +101,9 @@ class BatteryService : Service() { if (status != oldStatus) { var msg: String = BatteryUtils.getBatteryInfo(intent).toString() SettingUtils.batteryStatus = status - msg = getString(R.string.battery_status_changed) + BatteryUtils.getStatus(oldStatus) + " → " + BatteryUtils.getStatus(status) + msg + msg = getString(R.string.battery_status_changed) + BatteryUtils.getStatus( + oldStatus + ) + " → " + BatteryUtils.getStatus(status) + msg sendMessage(context, msg) } } @@ -104,7 +114,14 @@ class BatteryService : Service() { private fun sendMessage(context: Context, msg: String) { Log.i(TAG, msg) try { - val msgInfo = MsgInfo("app", "88888888", msg, Date(), getString(R.string.battery_status_monitor), -1) + val msgInfo = MsgInfo( + "app", + "88888888", + msg, + Date(), + getString(R.string.battery_status_monitor), + -1 + ) val request = OneTimeWorkRequestBuilder() .setInputData( workDataOf( 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 31613aca..9abee3f6 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 @@ -42,6 +42,7 @@ 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_AUTO_CLEAN_LOGS_DAYS = "auto_clean_logs_days" const val SP_BATTERY_RECEIVER = "enable_battery_receiver" const val SP_BATTERY_STATUS = "battery_status" @@ -164,20 +165,104 @@ const val TYPE_GOTIFY = 11 const val TYPE_DINGTALK_INNER_ROBOT = 12 const val TYPE_FEISHU_APP = 13 var SENDER_FRAGMENT_LIST = listOf( - PageInfo(getString(R.string.dingtalk_robot), "com.idormy.sms.forwarder.fragment.senders.DingtalkGroupRobotFragment", "{\"\":\"\"}", CoreAnim.slide, R.drawable.icon_dingtalk), - PageInfo(getString(R.string.email), "com.idormy.sms.forwarder.fragment.senders.EmailFragment", "{\"\":\"\"}", CoreAnim.slide, R.drawable.icon_email), - PageInfo(getString(R.string.bark), "com.idormy.sms.forwarder.fragment.senders.BarkFragment", "{\"\":\"\"}", CoreAnim.slide, R.drawable.icon_bark), - PageInfo(getString(R.string.webhook), "com.idormy.sms.forwarder.fragment.senders.WebhookFragment", "{\"\":\"\"}", CoreAnim.slide, R.drawable.icon_webhook), - PageInfo(getString(R.string.wework_robot), "com.idormy.sms.forwarder.fragment.senders.WeworkRobotFragment", "{\"\":\"\"}", CoreAnim.slide, R.drawable.icon_wework_robot), - PageInfo(getString(R.string.wework_agent), "com.idormy.sms.forwarder.fragment.senders.WeworkAgentFragment", "{\"\":\"\"}", CoreAnim.slide, R.drawable.icon_wework_agent), - PageInfo(getString(R.string.server_chan), "com.idormy.sms.forwarder.fragment.senders.ServerchanFragment", "{\"\":\"\"}", CoreAnim.slide, R.drawable.icon_serverchan), - PageInfo(getString(R.string.telegram), "com.idormy.sms.forwarder.fragment.senders.TelegramFragment", "{\"\":\"\"}", CoreAnim.slide, R.drawable.icon_telegram), - PageInfo(getString(R.string.sms_menu), "com.idormy.sms.forwarder.fragment.senders.SmsFragment", "{\"\":\"\"}", CoreAnim.slide, R.drawable.icon_sms), - PageInfo(getString(R.string.feishu), "com.idormy.sms.forwarder.fragment.senders.FeishuFragment", "{\"\":\"\"}", CoreAnim.slide, R.drawable.icon_feishu), - PageInfo(getString(R.string.pushplus), "com.idormy.sms.forwarder.fragment.senders.PushplusFragment", "{\"\":\"\"}", CoreAnim.slide, R.drawable.icon_pushplus), - PageInfo(getString(R.string.gotify), "com.idormy.sms.forwarder.fragment.senders.GotifyFragment", "{\"\":\"\"}", CoreAnim.slide, R.drawable.icon_gotify), - PageInfo(getString(R.string.dingtalk_inner_robot), "com.idormy.sms.forwarder.fragment.senders.DingtalkInnerRobotFragment", "{\"\":\"\"}", CoreAnim.slide, R.drawable.icon_dingtalk_inner), - PageInfo(getString(R.string.feishu_app), "com.idormy.sms.forwarder.fragment.senders.FeishuAppFragment", "{\"\":\"\"}", CoreAnim.slide, R.drawable.icon_feishu_app), + PageInfo( + getString(R.string.dingtalk_robot), + "com.idormy.sms.forwarder.fragment.senders.DingtalkGroupRobotFragment", + "{\"\":\"\"}", + CoreAnim.slide, + R.drawable.icon_dingtalk + ), + PageInfo( + getString(R.string.email), + "com.idormy.sms.forwarder.fragment.senders.EmailFragment", + "{\"\":\"\"}", + CoreAnim.slide, + R.drawable.icon_email + ), + PageInfo( + getString(R.string.bark), + "com.idormy.sms.forwarder.fragment.senders.BarkFragment", + "{\"\":\"\"}", + CoreAnim.slide, + R.drawable.icon_bark + ), + PageInfo( + getString(R.string.webhook), + "com.idormy.sms.forwarder.fragment.senders.WebhookFragment", + "{\"\":\"\"}", + CoreAnim.slide, + R.drawable.icon_webhook + ), + PageInfo( + getString(R.string.wework_robot), + "com.idormy.sms.forwarder.fragment.senders.WeworkRobotFragment", + "{\"\":\"\"}", + CoreAnim.slide, + R.drawable.icon_wework_robot + ), + PageInfo( + getString(R.string.wework_agent), + "com.idormy.sms.forwarder.fragment.senders.WeworkAgentFragment", + "{\"\":\"\"}", + CoreAnim.slide, + R.drawable.icon_wework_agent + ), + PageInfo( + getString(R.string.server_chan), + "com.idormy.sms.forwarder.fragment.senders.ServerchanFragment", + "{\"\":\"\"}", + CoreAnim.slide, + R.drawable.icon_serverchan + ), + PageInfo( + getString(R.string.telegram), + "com.idormy.sms.forwarder.fragment.senders.TelegramFragment", + "{\"\":\"\"}", + CoreAnim.slide, + R.drawable.icon_telegram + ), + PageInfo( + getString(R.string.sms_menu), + "com.idormy.sms.forwarder.fragment.senders.SmsFragment", + "{\"\":\"\"}", + CoreAnim.slide, + R.drawable.icon_sms + ), + PageInfo( + getString(R.string.feishu), + "com.idormy.sms.forwarder.fragment.senders.FeishuFragment", + "{\"\":\"\"}", + CoreAnim.slide, + R.drawable.icon_feishu + ), + PageInfo( + getString(R.string.pushplus), + "com.idormy.sms.forwarder.fragment.senders.PushplusFragment", + "{\"\":\"\"}", + CoreAnim.slide, + R.drawable.icon_pushplus + ), + PageInfo( + getString(R.string.gotify), + "com.idormy.sms.forwarder.fragment.senders.GotifyFragment", + "{\"\":\"\"}", + CoreAnim.slide, + R.drawable.icon_gotify + ), + PageInfo( + getString(R.string.dingtalk_inner_robot), + "com.idormy.sms.forwarder.fragment.senders.DingtalkInnerRobotFragment", + "{\"\":\"\"}", + CoreAnim.slide, + R.drawable.icon_dingtalk_inner + ), + PageInfo( + getString(R.string.feishu_app), + "com.idormy.sms.forwarder.fragment.senders.FeishuAppFragment", + "{\"\":\"\"}", + CoreAnim.slide, + R.drawable.icon_feishu_app + ), ) //前台服务 @@ -252,11 +337,53 @@ const val SP_SERVER_HISTORY = "server_history" const val SP_SERVER_CONFIG = "server_config" const val SP_CLIENT_SIGN_KEY = "client_sign_key" var CLIENT_FRAGMENT_LIST = listOf( - PageInfo(getString(R.string.api_clone), "com.idormy.sms.forwarder.fragment.client.CloneFragment", "{\"\":\"\"}", CoreAnim.slide, R.drawable.icon_api_clone), - PageInfo(getString(R.string.api_sms_send), "com.idormy.sms.forwarder.fragment.client.SmsSendFragment", "{\"\":\"\"}", CoreAnim.slide, R.drawable.icon_api_sms_send), - PageInfo(getString(R.string.api_sms_query), "com.idormy.sms.forwarder.fragment.client.SmsQueryFragment", "{\"\":\"\"}", CoreAnim.slide, R.drawable.icon_api_sms_query), - PageInfo(getString(R.string.api_call_query), "com.idormy.sms.forwarder.fragment.client.CallQueryFragment", "{\"\":\"\"}", CoreAnim.slide, R.drawable.icon_api_call_query), - PageInfo(getString(R.string.api_contact_query), "com.idormy.sms.forwarder.fragment.client.ContactQueryFragment", "{\"\":\"\"}", CoreAnim.slide, R.drawable.icon_api_contact_query), - PageInfo(getString(R.string.api_battery_query), "com.idormy.sms.forwarder.fragment.client.BatteryQueryFragment", "{\"\":\"\"}", CoreAnim.slide, R.drawable.icon_api_battery_query), - PageInfo(getString(R.string.api_wol), "com.idormy.sms.forwarder.fragment.client.WolSendFragment", "{\"\":\"\"}", CoreAnim.slide, R.drawable.icon_api_wol), + PageInfo( + getString(R.string.api_clone), + "com.idormy.sms.forwarder.fragment.client.CloneFragment", + "{\"\":\"\"}", + CoreAnim.slide, + R.drawable.icon_api_clone + ), + PageInfo( + getString(R.string.api_sms_send), + "com.idormy.sms.forwarder.fragment.client.SmsSendFragment", + "{\"\":\"\"}", + CoreAnim.slide, + R.drawable.icon_api_sms_send + ), + PageInfo( + getString(R.string.api_sms_query), + "com.idormy.sms.forwarder.fragment.client.SmsQueryFragment", + "{\"\":\"\"}", + CoreAnim.slide, + R.drawable.icon_api_sms_query + ), + PageInfo( + getString(R.string.api_call_query), + "com.idormy.sms.forwarder.fragment.client.CallQueryFragment", + "{\"\":\"\"}", + CoreAnim.slide, + R.drawable.icon_api_call_query + ), + PageInfo( + getString(R.string.api_contact_query), + "com.idormy.sms.forwarder.fragment.client.ContactQueryFragment", + "{\"\":\"\"}", + CoreAnim.slide, + R.drawable.icon_api_contact_query + ), + PageInfo( + getString(R.string.api_battery_query), + "com.idormy.sms.forwarder.fragment.client.BatteryQueryFragment", + "{\"\":\"\"}", + CoreAnim.slide, + R.drawable.icon_api_battery_query + ), + PageInfo( + getString(R.string.api_wol), + "com.idormy.sms.forwarder.fragment.client.WolSendFragment", + "{\"\":\"\"}", + CoreAnim.slide, + R.drawable.icon_api_wol + ), ) \ 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 fb015d7b..4080a86c 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 @@ -141,6 +141,14 @@ class SettingUtils private constructor() { MMKVUtils.put(SP_SILENT_PERIOD_END, silentPeriodEnd) } + //自动删除N天前的转发记录 + @JvmStatic + var autoCleanLogsDays: Int + get() = MMKVUtils.getInt(SP_AUTO_CLEAN_LOGS_DAYS, 0) + set(autoCleanLogsDays) { + MMKVUtils.put(SP_AUTO_CLEAN_LOGS_DAYS, autoCleanLogsDays) + } + //是否监听电池状态变化 @JvmStatic var enableBatteryReceiver: Boolean diff --git a/app/src/main/res/layout/fragment_settings.xml b/app/src/main/res/layout/fragment_settings.xml index eaf3b80e..1ca1075f 100644 --- a/app/src/main/res/layout/fragment_settings.xml +++ b/app/src/main/res/layout/fragment_settings.xml @@ -435,6 +435,53 @@ + + + + + + + + + + + + + + + + Immediately display notifications Time-sensitive notifications that can be displayed in a focused state Only added to the notification list, no screen reminder - + Url format error Fill in the username before @ @@ -916,4 +916,7 @@ App ID App Secret User ID + Auto delete logs N days ago + 0=disabled, scan when battery change + diff --git a/app/src/main/res/values/strings.xml b/app/src/main/res/values/strings.xml index a6fc2b9b..21e9b03e 100644 --- a/app/src/main/res/values/strings.xml +++ b/app/src/main/res/values/strings.xml @@ -685,7 +685,7 @@ 立即亮屏显示通知 时效性通知,可在专注状态下显示通知 仅添加到通知列表,不会亮屏提醒 - + Url格式错误 填写 @ 前面的用户名 @@ -917,4 +917,7 @@ App ID App Secret User ID + 自动删除N天前的转发记录 + 0=禁用,触发机制:每次电量变化时扫描 +