新增:自动删除N天前的转发记录(0=禁用,触发机制:每次电量变化时扫描) #224
This commit is contained in:
parent
c2df047dc1
commit
66e324bbbb
|
@ -7,6 +7,7 @@ import androidx.room.RoomDatabase
|
||||||
import androidx.room.TypeConverters
|
import androidx.room.TypeConverters
|
||||||
import androidx.room.migration.Migration
|
import androidx.room.migration.Migration
|
||||||
import androidx.sqlite.db.SupportSQLiteDatabase
|
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.FrpcDao
|
||||||
import com.idormy.sms.forwarder.database.dao.LogsDao
|
import com.idormy.sms.forwarder.database.dao.LogsDao
|
||||||
import com.idormy.sms.forwarder.database.dao.RuleDao
|
import com.idormy.sms.forwarder.database.dao.RuleDao
|
||||||
|
@ -43,7 +44,11 @@ abstract class AppDatabase : RoomDatabase() {
|
||||||
}
|
}
|
||||||
|
|
||||||
private fun buildDatabase(context: Context): AppDatabase {
|
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:允许主线程访问,后面再优化
|
.allowMainThreadQueries() //TODO:允许主线程访问,后面再优化
|
||||||
.addCallback(object : RoomDatabase.Callback() {
|
.addCallback(object : RoomDatabase.Callback() {
|
||||||
override fun onCreate(db: SupportSQLiteDatabase) {
|
override fun onCreate(db: SupportSQLiteDatabase) {
|
||||||
|
@ -93,10 +98,14 @@ custom_domains = smsf.demo.com
|
||||||
MIGRATION_8_9,
|
MIGRATION_8_9,
|
||||||
MIGRATION_9_10,
|
MIGRATION_9_10,
|
||||||
)
|
)
|
||||||
.setQueryCallback({ sqlQuery, bindArgs ->
|
|
||||||
|
if (BuildConfig.DEBUG) {
|
||||||
|
builder.setQueryCallback({ sqlQuery, bindArgs ->
|
||||||
println("SQL_QUERY: $sqlQuery\nBIND_ARGS: $bindArgs")
|
println("SQL_QUERY: $sqlQuery\nBIND_ARGS: $bindArgs")
|
||||||
}, Executors.newSingleThreadExecutor())
|
}, Executors.newSingleThreadExecutor())
|
||||||
.build()
|
}
|
||||||
|
|
||||||
|
return builder.build()
|
||||||
}
|
}
|
||||||
|
|
||||||
//转发日志添加SIM卡槽信息
|
//转发日志添加SIM卡槽信息
|
||||||
|
|
|
@ -22,6 +22,9 @@ interface LogsDao {
|
||||||
@Query("DELETE FROM Logs where type=:type")
|
@Query("DELETE FROM Logs where type=:type")
|
||||||
fun deleteAll(type: String): Completable
|
fun deleteAll(type: String): Completable
|
||||||
|
|
||||||
|
@Query("DELETE FROM Logs where time<:time")
|
||||||
|
fun deleteTimeAgo(time: Long)
|
||||||
|
|
||||||
@Update
|
@Update
|
||||||
fun update(logs: Logs): Completable
|
fun update(logs: Logs): Completable
|
||||||
|
|
||||||
|
|
|
@ -11,9 +11,15 @@ class LogsRepository(private val logsDao: LogsDao) {
|
||||||
logsDao.delete(id)
|
logsDao.delete(id)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@WorkerThread
|
||||||
|
fun deleteTimeAgo(time: Long) {
|
||||||
|
logsDao.deleteTimeAgo(time)
|
||||||
|
}
|
||||||
|
|
||||||
@WorkerThread
|
@WorkerThread
|
||||||
suspend fun insert(logs: Logs): Long = logsDao.insert(logs)
|
suspend fun insert(logs: Logs): Long = logsDao.insert(logs)
|
||||||
|
|
||||||
@WorkerThread
|
@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)
|
||||||
}
|
}
|
|
@ -78,18 +78,38 @@ class SettingsFragment : BaseFragment<FragmentSettingsBinding?>(), View.OnClickL
|
||||||
//转发短信广播
|
//转发短信广播
|
||||||
switchEnableSms(binding!!.sbEnableSms)
|
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信息
|
//启动时异步获取已安装App信息
|
||||||
switchEnableLoadAppList(binding!!.sbEnableLoadAppList, binding!!.scbLoadUserApp, binding!!.scbLoadSystemApp)
|
switchEnableLoadAppList(
|
||||||
|
binding!!.sbEnableLoadAppList,
|
||||||
|
binding!!.scbLoadUserApp,
|
||||||
|
binding!!.scbLoadSystemApp
|
||||||
|
)
|
||||||
//过滤多久内重复消息
|
//过滤多久内重复消息
|
||||||
binding!!.xsbDuplicateMessagesLimits.setDefaultValue(SettingUtils.duplicateMessagesLimits)
|
binding!!.xsbDuplicateMessagesLimits.setDefaultValue(SettingUtils.duplicateMessagesLimits)
|
||||||
binding!!.xsbDuplicateMessagesLimits.setOnSeekBarListener { _: XSeekBar?, newValue: Int ->
|
binding!!.xsbDuplicateMessagesLimits.setOnSeekBarListener { _: XSeekBar?, newValue: Int ->
|
||||||
SettingUtils.duplicateMessagesLimits = newValue
|
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)
|
switchBatteryReceiver(binding!!.sbBatteryReceiver)
|
||||||
|
@ -108,7 +128,11 @@ class SettingsFragment : BaseFragment<FragmentSettingsBinding?>(), View.OnClickL
|
||||||
switchExcludeFromRecents(binding!!.layoutExcludeFromRecents, binding!!.sbExcludeFromRecents)
|
switchExcludeFromRecents(binding!!.layoutExcludeFromRecents, binding!!.sbExcludeFromRecents)
|
||||||
|
|
||||||
//Cactus增强保活措施
|
//Cactus增强保活措施
|
||||||
switchEnableCactus(binding!!.sbEnableCactus, binding!!.scbPlaySilenceMusic, binding!!.scbOnePixelActivity)
|
switchEnableCactus(
|
||||||
|
binding!!.sbEnableCactus,
|
||||||
|
binding!!.scbPlaySilenceMusic,
|
||||||
|
binding!!.scbOnePixelActivity
|
||||||
|
)
|
||||||
|
|
||||||
//接口请求失败重试时间间隔
|
//接口请求失败重试时间间隔
|
||||||
editRetryDelayTime(binding!!.etRetryTimes, binding!!.etDelayTime, binding!!.etTimeout)
|
editRetryDelayTime(binding!!.etRetryTimes, binding!!.etDelayTime, binding!!.etTimeout)
|
||||||
|
@ -152,14 +176,16 @@ class SettingsFragment : BaseFragment<FragmentSettingsBinding?>(), View.OnClickL
|
||||||
val etSmsTemplate: EditText = binding!!.etSmsTemplate
|
val etSmsTemplate: EditText = binding!!.etSmsTemplate
|
||||||
when (v.id) {
|
when (v.id) {
|
||||||
R.id.btn_silent_period -> {
|
R.id.btn_silent_period -> {
|
||||||
OptionsPickerBuilder(context, OnOptionsSelectListener { _: View?, options1: Int, options2: Int, _: Int ->
|
OptionsPickerBuilder(
|
||||||
SettingUtils.silentPeriodStart = options1
|
context,
|
||||||
SettingUtils.silentPeriodEnd = options2
|
OnOptionsSelectListener { _: View?, options1: Int, options2: Int, _: Int ->
|
||||||
val txt = mTimeOption[options1] + " ~ " + mTimeOption[options2]
|
SettingUtils.silentPeriodStart = options1
|
||||||
binding!!.tvSilentPeriod.text = txt
|
SettingUtils.silentPeriodEnd = options2
|
||||||
XToastUtils.toast(txt)
|
val txt = mTimeOption[options1] + " ~ " + mTimeOption[options2]
|
||||||
return@OnOptionsSelectListener false
|
binding!!.tvSilentPeriod.text = txt
|
||||||
}).setTitleText(getString(R.string.select_time_period))
|
XToastUtils.toast(txt)
|
||||||
|
return@OnOptionsSelectListener false
|
||||||
|
}).setTitleText(getString(R.string.select_time_period))
|
||||||
.setSelectOptions(SettingUtils.silentPeriodStart, SettingUtils.silentPeriodEnd)
|
.setSelectOptions(SettingUtils.silentPeriodStart, SettingUtils.silentPeriodEnd)
|
||||||
.build<Any>().also {
|
.build<Any>().also {
|
||||||
it.setNPicker(mTimeOption, mTimeOption)
|
it.setNPicker(mTimeOption, mTimeOption)
|
||||||
|
@ -178,7 +204,12 @@ class SettingsFragment : BaseFragment<FragmentSettingsBinding?>(), View.OnClickL
|
||||||
}
|
}
|
||||||
Log.d(TAG, App.SimInfoList.toString())
|
Log.d(TAG, App.SimInfoList.toString())
|
||||||
if (!App.SimInfoList.containsKey(0)) {
|
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
|
return
|
||||||
}
|
}
|
||||||
val simInfo: SimInfo? = App.SimInfoList[0]
|
val simInfo: SimInfo? = App.SimInfoList[0]
|
||||||
|
@ -193,7 +224,12 @@ class SettingsFragment : BaseFragment<FragmentSettingsBinding?>(), View.OnClickL
|
||||||
}
|
}
|
||||||
Log.d(TAG, App.SimInfoList.toString())
|
Log.d(TAG, App.SimInfoList.toString())
|
||||||
if (!App.SimInfoList.containsKey(1)) {
|
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
|
return
|
||||||
}
|
}
|
||||||
val simInfo: SimInfo? = App.SimInfoList[1]
|
val simInfo: SimInfo? = App.SimInfoList[1]
|
||||||
|
@ -209,15 +245,24 @@ class SettingsFragment : BaseFragment<FragmentSettingsBinding?>(), View.OnClickL
|
||||||
return
|
return
|
||||||
}
|
}
|
||||||
R.id.bt_insert_extra -> {
|
R.id.bt_insert_extra -> {
|
||||||
CommonUtils.insertOrReplaceText2Cursor(etSmsTemplate, getString(R.string.tag_card_slot))
|
CommonUtils.insertOrReplaceText2Cursor(
|
||||||
|
etSmsTemplate,
|
||||||
|
getString(R.string.tag_card_slot)
|
||||||
|
)
|
||||||
return
|
return
|
||||||
}
|
}
|
||||||
R.id.bt_insert_time -> {
|
R.id.bt_insert_time -> {
|
||||||
CommonUtils.insertOrReplaceText2Cursor(etSmsTemplate, getString(R.string.tag_receive_time))
|
CommonUtils.insertOrReplaceText2Cursor(
|
||||||
|
etSmsTemplate,
|
||||||
|
getString(R.string.tag_receive_time)
|
||||||
|
)
|
||||||
return
|
return
|
||||||
}
|
}
|
||||||
R.id.bt_insert_device_name -> {
|
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
|
return
|
||||||
}
|
}
|
||||||
else -> {}
|
else -> {}
|
||||||
|
@ -266,7 +311,13 @@ class SettingsFragment : BaseFragment<FragmentSettingsBinding?>(), View.OnClickL
|
||||||
|
|
||||||
//转发通话
|
//转发通话
|
||||||
@SuppressLint("UseSwitchCompatOrMaterialCode")
|
@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
|
sbEnablePhone.isChecked = SettingUtils.enablePhone
|
||||||
scbCallType1.isChecked = SettingUtils.enableCallType1
|
scbCallType1.isChecked = SettingUtils.enableCallType1
|
||||||
scbCallType2.isChecked = SettingUtils.enableCallType2
|
scbCallType2.isChecked = SettingUtils.enableCallType2
|
||||||
|
@ -350,7 +401,11 @@ class SettingsFragment : BaseFragment<FragmentSettingsBinding?>(), View.OnClickL
|
||||||
|
|
||||||
//转发应用通知
|
//转发应用通知
|
||||||
@SuppressLint("UseSwitchCompatOrMaterialCode")
|
@SuppressLint("UseSwitchCompatOrMaterialCode")
|
||||||
fun switchEnableAppNotify(sbEnableAppNotify: SwitchButton, scbCancelAppNotify: SmoothCheckBox, scbNotUserPresent: SmoothCheckBox) {
|
fun switchEnableAppNotify(
|
||||||
|
sbEnableAppNotify: SwitchButton,
|
||||||
|
scbCancelAppNotify: SmoothCheckBox,
|
||||||
|
scbNotUserPresent: SmoothCheckBox
|
||||||
|
) {
|
||||||
val layoutOptionalAction: LinearLayout = binding!!.layoutOptionalAction
|
val layoutOptionalAction: LinearLayout = binding!!.layoutOptionalAction
|
||||||
val isEnable: Boolean = SettingUtils.enableAppNotify
|
val isEnable: Boolean = SettingUtils.enableAppNotify
|
||||||
sbEnableAppNotify.isChecked = isEnable
|
sbEnableAppNotify.isChecked = isEnable
|
||||||
|
@ -383,7 +438,10 @@ class SettingsFragment : BaseFragment<FragmentSettingsBinding?>(), View.OnClickL
|
||||||
.positiveText(R.string.lab_yes)
|
.positiveText(R.string.lab_yes)
|
||||||
.negativeText(R.string.lab_no)
|
.negativeText(R.string.lab_no)
|
||||||
.onPositive { _: MaterialDialog?, _: DialogAction? ->
|
.onPositive { _: MaterialDialog?, _: DialogAction? ->
|
||||||
XXPermissions.startPermissionActivity(requireContext(), permissions)
|
XXPermissions.startPermissionActivity(
|
||||||
|
requireContext(),
|
||||||
|
permissions
|
||||||
|
)
|
||||||
}
|
}
|
||||||
.show()
|
.show()
|
||||||
}
|
}
|
||||||
|
@ -402,7 +460,11 @@ class SettingsFragment : BaseFragment<FragmentSettingsBinding?>(), View.OnClickL
|
||||||
|
|
||||||
//启动时异步获取已安装App信息 (binding!!.sbEnableLoadAppList, binding!!.scbLoadUserApp, binding!!.scbLoadSystemApp)
|
//启动时异步获取已安装App信息 (binding!!.sbEnableLoadAppList, binding!!.scbLoadUserApp, binding!!.scbLoadSystemApp)
|
||||||
@SuppressLint("UseSwitchCompatOrMaterialCode")
|
@SuppressLint("UseSwitchCompatOrMaterialCode")
|
||||||
fun switchEnableLoadAppList(sbEnableLoadAppList: SwitchButton, scbLoadUserApp: SmoothCheckBox, scbLoadSystemApp: SmoothCheckBox) {
|
fun switchEnableLoadAppList(
|
||||||
|
sbEnableLoadAppList: SwitchButton,
|
||||||
|
scbLoadUserApp: SmoothCheckBox,
|
||||||
|
scbLoadSystemApp: SmoothCheckBox
|
||||||
|
) {
|
||||||
val isEnable: Boolean = SettingUtils.enableLoadAppList
|
val isEnable: Boolean = SettingUtils.enableLoadAppList
|
||||||
sbEnableLoadAppList.isChecked = isEnable
|
sbEnableLoadAppList.isChecked = isEnable
|
||||||
|
|
||||||
|
@ -445,8 +507,14 @@ class SettingsFragment : BaseFragment<FragmentSettingsBinding?>(), View.OnClickL
|
||||||
}
|
}
|
||||||
|
|
||||||
//设置低电量报警
|
//设置低电量报警
|
||||||
private fun editBatteryLevelAlarm(xrsBatteryLevelAlarm: XRangeSlider, scbBatteryLevelAlarmOnce: SmoothCheckBox) {
|
private fun editBatteryLevelAlarm(
|
||||||
xrsBatteryLevelAlarm.setStartingMinMax(SettingUtils.batteryLevelMin, SettingUtils.batteryLevelMax)
|
xrsBatteryLevelAlarm: XRangeSlider,
|
||||||
|
scbBatteryLevelAlarmOnce: SmoothCheckBox
|
||||||
|
) {
|
||||||
|
xrsBatteryLevelAlarm.setStartingMinMax(
|
||||||
|
SettingUtils.batteryLevelMin,
|
||||||
|
SettingUtils.batteryLevelMax
|
||||||
|
)
|
||||||
xrsBatteryLevelAlarm.setOnRangeSliderListener(object : OnRangeSliderListener {
|
xrsBatteryLevelAlarm.setOnRangeSliderListener(object : OnRangeSliderListener {
|
||||||
override fun onMaxChanged(slider: XRangeSlider, maxValue: Int) {
|
override fun onMaxChanged(slider: XRangeSlider, maxValue: Int) {
|
||||||
//SettingUtils.batteryLevelMin = slider.selectedMin
|
//SettingUtils.batteryLevelMin = slider.selectedMin
|
||||||
|
@ -472,7 +540,8 @@ class SettingsFragment : BaseFragment<FragmentSettingsBinding?>(), View.OnClickL
|
||||||
@SuppressLint("UseSwitchCompatOrMaterialCode")
|
@SuppressLint("UseSwitchCompatOrMaterialCode")
|
||||||
fun switchBatteryCron(sbBatteryCron: SwitchButton) {
|
fun switchBatteryCron(sbBatteryCron: SwitchButton) {
|
||||||
sbBatteryCron.isChecked = SettingUtils.enableBatteryCron
|
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 ->
|
sbBatteryCron.setOnCheckedChangeListener { _: CompoundButton?, isChecked: Boolean ->
|
||||||
binding!!.layoutBatteryCron.visibility = if (isChecked) View.VISIBLE else View.GONE
|
binding!!.layoutBatteryCron.visibility = if (isChecked) View.VISIBLE else View.GONE
|
||||||
SettingUtils.enableBatteryCron = isChecked
|
SettingUtils.enableBatteryCron = isChecked
|
||||||
|
@ -482,7 +551,10 @@ class SettingsFragment : BaseFragment<FragmentSettingsBinding?>(), View.OnClickL
|
||||||
}
|
}
|
||||||
|
|
||||||
//设置推送电池状态时机
|
//设置推送电池状态时机
|
||||||
private fun editBatteryCronTiming(etBatteryCronStartTime: EditText, etBatteryCronInterval: EditText) {
|
private fun editBatteryCronTiming(
|
||||||
|
etBatteryCronStartTime: EditText,
|
||||||
|
etBatteryCronInterval: EditText
|
||||||
|
) {
|
||||||
etBatteryCronStartTime.setText(SettingUtils.batteryCronStartTime)
|
etBatteryCronStartTime.setText(SettingUtils.batteryCronStartTime)
|
||||||
etBatteryCronStartTime.setOnClickListener {
|
etBatteryCronStartTime.setOnClickListener {
|
||||||
val calendar = Calendar.getInstance()
|
val calendar = Calendar.getInstance()
|
||||||
|
@ -520,17 +592,22 @@ class SettingsFragment : BaseFragment<FragmentSettingsBinding?>(), View.OnClickL
|
||||||
}
|
}
|
||||||
|
|
||||||
//开机启动
|
//开机启动
|
||||||
private fun checkWithReboot(@SuppressLint("UseSwitchCompatOrMaterialCode") sbWithReboot: SwitchButton, tvAutoStartup: TextView) {
|
private fun checkWithReboot(
|
||||||
|
@SuppressLint("UseSwitchCompatOrMaterialCode") sbWithReboot: SwitchButton,
|
||||||
|
tvAutoStartup: TextView
|
||||||
|
) {
|
||||||
tvAutoStartup.text = getAutoStartTips()
|
tvAutoStartup.text = getAutoStartTips()
|
||||||
|
|
||||||
//获取组件
|
//获取组件
|
||||||
val cm = ComponentName(getAppPackageName(), BootReceiver::class.java.name)
|
val cm = ComponentName(getAppPackageName(), BootReceiver::class.java.name)
|
||||||
val pm: PackageManager = getPackageManager()
|
val pm: PackageManager = getPackageManager()
|
||||||
val state = pm.getComponentEnabledSetting(cm)
|
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 ->
|
sbWithReboot.setOnCheckedChangeListener { _: CompoundButton?, isChecked: Boolean ->
|
||||||
try {
|
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)
|
pm.setComponentEnabledSetting(cm, newState, PackageManager.DONT_KILL_APP)
|
||||||
if (isChecked) startToAutoStartSetting(requireContext())
|
if (isChecked) startToAutoStartSetting(requireContext())
|
||||||
} catch (e: Exception) {
|
} catch (e: Exception) {
|
||||||
|
@ -550,7 +627,8 @@ class SettingsFragment : BaseFragment<FragmentSettingsBinding?>(), View.OnClickL
|
||||||
}
|
}
|
||||||
|
|
||||||
try {
|
try {
|
||||||
val isIgnoreBatteryOptimization: Boolean = KeepAliveUtils.isIgnoreBatteryOptimization(requireActivity())
|
val isIgnoreBatteryOptimization: Boolean =
|
||||||
|
KeepAliveUtils.isIgnoreBatteryOptimization(requireActivity())
|
||||||
sbBatterySetting.isChecked = isIgnoreBatteryOptimization
|
sbBatterySetting.isChecked = isIgnoreBatteryOptimization
|
||||||
sbBatterySetting.setOnCheckedChangeListener { _: CompoundButton?, isChecked: Boolean ->
|
sbBatterySetting.setOnCheckedChangeListener { _: CompoundButton?, isChecked: Boolean ->
|
||||||
if (isChecked && !isIgnoreBatteryOptimization) {
|
if (isChecked && !isIgnoreBatteryOptimization) {
|
||||||
|
@ -570,7 +648,10 @@ class SettingsFragment : BaseFragment<FragmentSettingsBinding?>(), View.OnClickL
|
||||||
|
|
||||||
//不在最近任务列表中显示
|
//不在最近任务列表中显示
|
||||||
@SuppressLint("ObsoleteSdkInt,UseSwitchCompatOrMaterialCode")
|
@SuppressLint("ObsoleteSdkInt,UseSwitchCompatOrMaterialCode")
|
||||||
fun switchExcludeFromRecents(layoutExcludeFromRecents: LinearLayout, sbExcludeFromRecents: SwitchButton) {
|
fun switchExcludeFromRecents(
|
||||||
|
layoutExcludeFromRecents: LinearLayout,
|
||||||
|
sbExcludeFromRecents: SwitchButton
|
||||||
|
) {
|
||||||
//安卓6.0以下没有不在最近任务列表中显示
|
//安卓6.0以下没有不在最近任务列表中显示
|
||||||
if (Build.VERSION.SDK_INT < Build.VERSION_CODES.M) {
|
if (Build.VERSION.SDK_INT < Build.VERSION_CODES.M) {
|
||||||
layoutExcludeFromRecents.visibility = View.GONE
|
layoutExcludeFromRecents.visibility = View.GONE
|
||||||
|
@ -593,7 +674,11 @@ class SettingsFragment : BaseFragment<FragmentSettingsBinding?>(), View.OnClickL
|
||||||
|
|
||||||
//转发应用通知
|
//转发应用通知
|
||||||
@SuppressLint("UseSwitchCompatOrMaterialCode")
|
@SuppressLint("UseSwitchCompatOrMaterialCode")
|
||||||
fun switchEnableCactus(sbEnableCactus: SwitchButton, scbPlaySilenceMusic: SmoothCheckBox, scbOnePixelActivity: SmoothCheckBox) {
|
fun switchEnableCactus(
|
||||||
|
sbEnableCactus: SwitchButton,
|
||||||
|
scbPlaySilenceMusic: SmoothCheckBox,
|
||||||
|
scbOnePixelActivity: SmoothCheckBox
|
||||||
|
) {
|
||||||
val layoutCactusOptional: LinearLayout = binding!!.layoutCactusOptional
|
val layoutCactusOptional: LinearLayout = binding!!.layoutCactusOptional
|
||||||
val isEnable: Boolean = SettingUtils.enableCactus
|
val isEnable: Boolean = SettingUtils.enableCactus
|
||||||
sbEnableCactus.isChecked = isEnable
|
sbEnableCactus.isChecked = isEnable
|
||||||
|
@ -622,7 +707,11 @@ class SettingsFragment : BaseFragment<FragmentSettingsBinding?>(), 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.setText(java.lang.String.valueOf(SettingUtils.requestRetryTimes))
|
||||||
etRetryTimes.addTextChangedListener(object : TextWatcher {
|
etRetryTimes.addTextChangedListener(object : TextWatcher {
|
||||||
override fun beforeTextChanged(s: CharSequence, start: Int, count: Int, after: Int) {}
|
override fun beforeTextChanged(s: CharSequence, start: Int, count: Int, after: Int) {}
|
||||||
|
@ -721,7 +810,8 @@ class SettingsFragment : BaseFragment<FragmentSettingsBinding?>(), View.OnClickL
|
||||||
override fun onTextChanged(s: CharSequence, start: Int, before: Int, count: Int) {}
|
override fun onTextChanged(s: CharSequence, start: Int, before: Int, count: Int) {}
|
||||||
override fun afterTextChanged(s: Editable) {
|
override fun afterTextChanged(s: Editable) {
|
||||||
SettingUtils.notifyContent = etNotifyContent.text.toString().trim()
|
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<FragmentSettingsBinding?>(), View.OnClickL
|
||||||
} else {
|
} else {
|
||||||
//找不到? 网上的做法都是跳转到设置... 这基本上是没意义的 基本上自启动这个功能是第三方厂商自己写的安全管家类app
|
//找不到? 网上的做法都是跳转到设置... 这基本上是没意义的 基本上自启动这个功能是第三方厂商自己写的安全管家类app
|
||||||
//所以我是直接跳转到对应的安全管家/安全中心
|
//所以我是直接跳转到对应的安全管家/安全中心
|
||||||
intent = act?.let { context.packageManager.getLaunchIntentForPackage(it) }
|
intent =
|
||||||
|
act?.let { context.packageManager.getLaunchIntentForPackage(it) }
|
||||||
}
|
}
|
||||||
context.startActivity(intent)
|
context.startActivity(intent)
|
||||||
has = true
|
has = true
|
||||||
|
|
|
@ -13,6 +13,7 @@ import androidx.work.WorkManager
|
||||||
import androidx.work.workDataOf
|
import androidx.work.workDataOf
|
||||||
import com.google.gson.Gson
|
import com.google.gson.Gson
|
||||||
import com.idormy.sms.forwarder.R
|
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.entity.MsgInfo
|
||||||
import com.idormy.sms.forwarder.utils.BatteryUtils
|
import com.idormy.sms.forwarder.utils.BatteryUtils
|
||||||
import com.idormy.sms.forwarder.utils.SettingUtils
|
import com.idormy.sms.forwarder.utils.SettingUtils
|
||||||
|
@ -58,6 +59,13 @@ class BatteryService : Service() {
|
||||||
private val batteryReceiver: BroadcastReceiver = object : BroadcastReceiver() {
|
private val batteryReceiver: BroadcastReceiver = object : BroadcastReceiver() {
|
||||||
@SuppressLint("DefaultLocale")
|
@SuppressLint("DefaultLocale")
|
||||||
override fun onReceive(context: Context, intent: Intent) {
|
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)
|
val levelCur: Int = intent.getIntExtra("level", 0)
|
||||||
|
@ -93,7 +101,9 @@ class BatteryService : Service() {
|
||||||
if (status != oldStatus) {
|
if (status != oldStatus) {
|
||||||
var msg: String = BatteryUtils.getBatteryInfo(intent).toString()
|
var msg: String = BatteryUtils.getBatteryInfo(intent).toString()
|
||||||
SettingUtils.batteryStatus = status
|
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)
|
sendMessage(context, msg)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -104,7 +114,14 @@ class BatteryService : Service() {
|
||||||
private fun sendMessage(context: Context, msg: String) {
|
private fun sendMessage(context: Context, msg: String) {
|
||||||
Log.i(TAG, msg)
|
Log.i(TAG, msg)
|
||||||
try {
|
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<SendWorker>()
|
val request = OneTimeWorkRequestBuilder<SendWorker>()
|
||||||
.setInputData(
|
.setInputData(
|
||||||
workDataOf(
|
workDataOf(
|
||||||
|
|
|
@ -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_DUPLICATE_MESSAGES_LIMITS = "duplicate_messages_limits"
|
||||||
const val SP_SILENT_PERIOD_START = "silent_period_start"
|
const val SP_SILENT_PERIOD_START = "silent_period_start"
|
||||||
const val SP_SILENT_PERIOD_END = "silent_period_end"
|
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_RECEIVER = "enable_battery_receiver"
|
||||||
const val SP_BATTERY_STATUS = "battery_status"
|
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_DINGTALK_INNER_ROBOT = 12
|
||||||
const val TYPE_FEISHU_APP = 13
|
const val TYPE_FEISHU_APP = 13
|
||||||
var SENDER_FRAGMENT_LIST = listOf(
|
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(
|
||||||
PageInfo(getString(R.string.email), "com.idormy.sms.forwarder.fragment.senders.EmailFragment", "{\"\":\"\"}", CoreAnim.slide, R.drawable.icon_email),
|
getString(R.string.dingtalk_robot),
|
||||||
PageInfo(getString(R.string.bark), "com.idormy.sms.forwarder.fragment.senders.BarkFragment", "{\"\":\"\"}", CoreAnim.slide, R.drawable.icon_bark),
|
"com.idormy.sms.forwarder.fragment.senders.DingtalkGroupRobotFragment",
|
||||||
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),
|
CoreAnim.slide,
|
||||||
PageInfo(getString(R.string.wework_agent), "com.idormy.sms.forwarder.fragment.senders.WeworkAgentFragment", "{\"\":\"\"}", CoreAnim.slide, R.drawable.icon_wework_agent),
|
R.drawable.icon_dingtalk
|
||||||
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(
|
||||||
PageInfo(getString(R.string.sms_menu), "com.idormy.sms.forwarder.fragment.senders.SmsFragment", "{\"\":\"\"}", CoreAnim.slide, R.drawable.icon_sms),
|
getString(R.string.email),
|
||||||
PageInfo(getString(R.string.feishu), "com.idormy.sms.forwarder.fragment.senders.FeishuFragment", "{\"\":\"\"}", CoreAnim.slide, R.drawable.icon_feishu),
|
"com.idormy.sms.forwarder.fragment.senders.EmailFragment",
|
||||||
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),
|
CoreAnim.slide,
|
||||||
PageInfo(getString(R.string.dingtalk_inner_robot), "com.idormy.sms.forwarder.fragment.senders.DingtalkInnerRobotFragment", "{\"\":\"\"}", CoreAnim.slide, R.drawable.icon_dingtalk_inner),
|
R.drawable.icon_email
|
||||||
PageInfo(getString(R.string.feishu_app), "com.idormy.sms.forwarder.fragment.senders.FeishuAppFragment", "{\"\":\"\"}", CoreAnim.slide, R.drawable.icon_feishu_app),
|
),
|
||||||
|
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_SERVER_CONFIG = "server_config"
|
||||||
const val SP_CLIENT_SIGN_KEY = "client_sign_key"
|
const val SP_CLIENT_SIGN_KEY = "client_sign_key"
|
||||||
var CLIENT_FRAGMENT_LIST = listOf(
|
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(
|
||||||
PageInfo(getString(R.string.api_sms_send), "com.idormy.sms.forwarder.fragment.client.SmsSendFragment", "{\"\":\"\"}", CoreAnim.slide, R.drawable.icon_api_sms_send),
|
getString(R.string.api_clone),
|
||||||
PageInfo(getString(R.string.api_sms_query), "com.idormy.sms.forwarder.fragment.client.SmsQueryFragment", "{\"\":\"\"}", CoreAnim.slide, R.drawable.icon_api_sms_query),
|
"com.idormy.sms.forwarder.fragment.client.CloneFragment",
|
||||||
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),
|
CoreAnim.slide,
|
||||||
PageInfo(getString(R.string.api_battery_query), "com.idormy.sms.forwarder.fragment.client.BatteryQueryFragment", "{\"\":\"\"}", CoreAnim.slide, R.drawable.icon_api_battery_query),
|
R.drawable.icon_api_clone
|
||||||
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_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
|
||||||
|
),
|
||||||
)
|
)
|
|
@ -141,6 +141,14 @@ class SettingUtils private constructor() {
|
||||||
MMKVUtils.put(SP_SILENT_PERIOD_END, silentPeriodEnd)
|
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
|
@JvmStatic
|
||||||
var enableBatteryReceiver: Boolean
|
var enableBatteryReceiver: Boolean
|
||||||
|
|
|
@ -435,6 +435,53 @@
|
||||||
|
|
||||||
</LinearLayout>
|
</LinearLayout>
|
||||||
|
|
||||||
|
<LinearLayout
|
||||||
|
style="@style/settingBarStyle"
|
||||||
|
android:layout_width="match_parent"
|
||||||
|
android:layout_height="wrap_content"
|
||||||
|
android:paddingEnd="15dp"
|
||||||
|
tools:ignore="RtlSymmetry">
|
||||||
|
|
||||||
|
<LinearLayout
|
||||||
|
android:layout_width="wrap_content"
|
||||||
|
android:layout_height="wrap_content"
|
||||||
|
android:orientation="vertical">
|
||||||
|
|
||||||
|
<TextView
|
||||||
|
android:layout_width="wrap_content"
|
||||||
|
android:layout_height="wrap_content"
|
||||||
|
android:text="@string/auto_clean_logs"
|
||||||
|
android:textStyle="bold"
|
||||||
|
tools:ignore="RelativeOverlap" />
|
||||||
|
|
||||||
|
<TextView
|
||||||
|
android:layout_width="wrap_content"
|
||||||
|
android:layout_height="wrap_content"
|
||||||
|
android:text="@string/auto_clean_logs_tips"
|
||||||
|
android:textSize="9sp"
|
||||||
|
tools:ignore="SmallSp" />
|
||||||
|
|
||||||
|
</LinearLayout>
|
||||||
|
|
||||||
|
<com.xuexiang.xui.widget.picker.XSeekBar
|
||||||
|
android:id="@+id/xsb_auto_clean_logs"
|
||||||
|
android:layout_width="0dp"
|
||||||
|
android:layout_height="wrap_content"
|
||||||
|
android:layout_marginStart="5dp"
|
||||||
|
android:layout_weight="1"
|
||||||
|
app:xsb_max="60"
|
||||||
|
app:xsb_min="0" />
|
||||||
|
|
||||||
|
<TextView
|
||||||
|
android:layout_width="wrap_content"
|
||||||
|
android:layout_height="wrap_content"
|
||||||
|
android:layout_marginStart="5dp"
|
||||||
|
android:text="@string/day"
|
||||||
|
android:textSize="12sp"
|
||||||
|
android:textStyle="bold" />
|
||||||
|
|
||||||
|
</LinearLayout>
|
||||||
|
|
||||||
<LinearLayout
|
<LinearLayout
|
||||||
android:layout_width="match_parent"
|
android:layout_width="match_parent"
|
||||||
android:layout_height="wrap_content"
|
android:layout_height="wrap_content"
|
||||||
|
|
|
@ -684,7 +684,7 @@
|
||||||
<string name="bark_level_active">Immediately display notifications</string>
|
<string name="bark_level_active">Immediately display notifications</string>
|
||||||
<string name="bark_level_timeSensitive">Time-sensitive notifications that can be displayed in a focused state</string>
|
<string name="bark_level_timeSensitive">Time-sensitive notifications that can be displayed in a focused state</string>
|
||||||
<string name="bark_level_passive">Only added to the notification list, no screen reminder</string>
|
<string name="bark_level_passive">Only added to the notification list, no screen reminder</string>
|
||||||
<string name="bark_url_regex" tools:ignore="TypographyDashes" formatted="false"><![CDATA[^(https?|ftp|file)://[-a-zA-Z0-9+&@#/%?=~_|!:,.;]*[-a-zA-Z0-9+&@#/%=~_|]]]></string>
|
<string name="bark_url_regex" formatted="false" tools:ignore="TypographyDashes"><![CDATA[^(https?|ftp|file)://[-a-zA-Z0-9+&@#/%?=~_|!:,.;]*[-a-zA-Z0-9+&@#/%=~_|]]]></string>
|
||||||
<string name="bark_url_error">Url format error</string>
|
<string name="bark_url_error">Url format error</string>
|
||||||
|
|
||||||
<string name="from_email_hint">Fill in the username before @</string>
|
<string name="from_email_hint">Fill in the username before @</string>
|
||||||
|
@ -916,4 +916,7 @@
|
||||||
<string name="app_id">App ID</string>
|
<string name="app_id">App ID</string>
|
||||||
<string name="app_secret">App Secret</string>
|
<string name="app_secret">App Secret</string>
|
||||||
<string name="user_id">User ID</string>
|
<string name="user_id">User ID</string>
|
||||||
|
<string name="auto_clean_logs">Auto delete logs N days ago</string>
|
||||||
|
<string name="auto_clean_logs_tips">0=disabled, scan when battery change</string>
|
||||||
|
<string name="day">天</string>
|
||||||
</resources>
|
</resources>
|
||||||
|
|
|
@ -685,7 +685,7 @@
|
||||||
<string name="bark_level_active">立即亮屏显示通知</string>
|
<string name="bark_level_active">立即亮屏显示通知</string>
|
||||||
<string name="bark_level_timeSensitive">时效性通知,可在专注状态下显示通知</string>
|
<string name="bark_level_timeSensitive">时效性通知,可在专注状态下显示通知</string>
|
||||||
<string name="bark_level_passive">仅添加到通知列表,不会亮屏提醒</string>
|
<string name="bark_level_passive">仅添加到通知列表,不会亮屏提醒</string>
|
||||||
<string name="bark_url_regex" tools:ignore="TypographyDashes" formatted="false"><![CDATA[^(https?|ftp|file)://[-a-zA-Z0-9+&@#/%?=~_|!:,.;]*[-a-zA-Z0-9+&@#/%=~_|]]]></string>
|
<string name="bark_url_regex" formatted="false" tools:ignore="TypographyDashes"><![CDATA[^(https?|ftp|file)://[-a-zA-Z0-9+&@#/%?=~_|!:,.;]*[-a-zA-Z0-9+&@#/%=~_|]]]></string>
|
||||||
<string name="bark_url_error">Url格式错误</string>
|
<string name="bark_url_error">Url格式错误</string>
|
||||||
|
|
||||||
<string name="from_email_hint">填写 @ 前面的用户名</string>
|
<string name="from_email_hint">填写 @ 前面的用户名</string>
|
||||||
|
@ -917,4 +917,7 @@
|
||||||
<string name="app_id">App ID</string>
|
<string name="app_id">App ID</string>
|
||||||
<string name="app_secret">App Secret</string>
|
<string name="app_secret">App Secret</string>
|
||||||
<string name="user_id">User ID</string>
|
<string name="user_id">User ID</string>
|
||||||
|
<string name="auto_clean_logs">自动删除N天前的转发记录</string>
|
||||||
|
<string name="auto_clean_logs_tips">0=禁用,触发机制:每次电量变化时扫描</string>
|
||||||
|
<string name="day">天</string>
|
||||||
</resources>
|
</resources>
|
||||||
|
|
Loading…
Reference in New Issue