diff --git a/app/src/main/java/com/idormy/sms/forwarder/fragment/condition/BatteryFragment.kt b/app/src/main/java/com/idormy/sms/forwarder/fragment/condition/BatteryFragment.kt index e6e8e0a6..03dcabc3 100644 --- a/app/src/main/java/com/idormy/sms/forwarder/fragment/condition/BatteryFragment.kt +++ b/app/src/main/java/com/idormy/sms/forwarder/fragment/condition/BatteryFragment.kt @@ -15,15 +15,12 @@ import com.idormy.sms.forwarder.entity.task.BatterySetting import com.idormy.sms.forwarder.utils.KEY_BACK_DATA_CONDITION import com.idormy.sms.forwarder.utils.KEY_BACK_DESCRIPTION_CONDITION import com.idormy.sms.forwarder.utils.KEY_EVENT_DATA_CONDITION -import com.idormy.sms.forwarder.utils.KEY_TEST_CONDITION import com.idormy.sms.forwarder.utils.TASK_CONDITION_BATTERY import com.idormy.sms.forwarder.utils.XToastUtils -import com.jeremyliao.liveeventbus.LiveEventBus import com.xuexiang.xaop.annotation.SingleClick import com.xuexiang.xpage.annotation.Page import com.xuexiang.xrouter.annotation.AutoWired import com.xuexiang.xrouter.launcher.XRouter -import com.xuexiang.xui.utils.CountDownButtonHelper import com.xuexiang.xui.widget.actionbar.TitleBar @Page(name = "Battery") @@ -32,7 +29,6 @@ class BatteryFragment : BaseFragment(), V private val TAG: String = BatteryFragment::class.java.simpleName var titleBar: TitleBar? = null - private var mCountDownHelper: CountDownButtonHelper? = null @JvmField @AutoWired(name = KEY_EVENT_DATA_CONDITION) @@ -60,18 +56,6 @@ class BatteryFragment : BaseFragment(), V * 初始化控件 */ override fun initViews() { - //测试按钮增加倒计时,避免重复点击 - mCountDownHelper = CountDownButtonHelper(binding!!.btnTest, 3) - 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) - } - }) - binding!!.rgStatus.setOnCheckedChangeListener { _, checkedId -> if (checkedId == R.id.rb_battery_discharging) { binding!!.xsbLevelMin.visibility = View.VISIBLE @@ -80,16 +64,18 @@ class BatteryFragment : BaseFragment(), V binding!!.xsbLevelMin.visibility = View.GONE binding!!.xsbLevelMax.visibility = View.VISIBLE } + checkSetting(true) } Log.d(TAG, "initViews eventData:$eventData") if (eventData != null) { val settingVo = Gson().fromJson(eventData, BatterySetting::class.java) Log.d(TAG, "initViews settingVo:$settingVo") - binding!!.rgStatus.check(settingVo.getStatusCheckId()) + binding!!.tvDescription.text = settingVo.description binding!!.xsbLevelMin.setDefaultValue(settingVo.levelMin) binding!!.xsbLevelMax.setDefaultValue(settingVo.levelMax) binding!!.sbKeepReminding.isChecked = settingVo.keepReminding + binding!!.rgStatus.check(settingVo.getStatusCheckId()) } else { binding!!.xsbLevelMin.setDefaultValue(10) binding!!.xsbLevelMax.setDefaultValue(90) @@ -98,17 +84,16 @@ class BatteryFragment : BaseFragment(), V @SuppressLint("SetTextI18n") override fun initListeners() { - binding!!.btnTest.setOnClickListener(this) binding!!.btnDel.setOnClickListener(this) binding!!.btnSave.setOnClickListener(this) - LiveEventBus.get(KEY_TEST_CONDITION, String::class.java).observe(this) { - mCountDownHelper?.finish() - - if (it == "success") { - XToastUtils.success("测试通过", 30000) - } else { - XToastUtils.error(it, 30000) - } + binding!!.xsbLevelMin.setOnSeekBarListener { _, _ -> + checkSetting(true) + } + binding!!.xsbLevelMax.setOnSeekBarListener { _, _ -> + checkSetting(true) + } + binding!!.sbKeepReminding.setOnCheckedChangeListener { _, _ -> + checkSetting(true) } } @@ -116,20 +101,6 @@ class BatteryFragment : BaseFragment(), V override fun onClick(v: View) { try { when (v.id) { - R.id.btn_test -> { - mCountDownHelper?.start() - Thread { - try { - val settingVo = checkSetting() - Log.d(TAG, settingVo.toString()) - LiveEventBus.get(KEY_TEST_CONDITION, String::class.java).post("success") - } catch (e: Exception) { - LiveEventBus.get(KEY_TEST_CONDITION, String::class.java).post(e.message.toString()) - e.printStackTrace() - } - }.start() - return - } R.id.btn_del -> { popToBack() @@ -154,26 +125,34 @@ class BatteryFragment : BaseFragment(), V //检查设置 @SuppressLint("SetTextI18n") - private fun checkSetting(): BatterySetting { + private fun checkSetting(updateView: Boolean = false): BatterySetting { val levelMin = binding!!.xsbLevelMin.selectedNumber val levelMax = binding!!.xsbLevelMax.selectedNumber val keepReminding = binding!!.sbKeepReminding.isChecked - val status: Int - if (binding!!.rgStatus.checkedRadioButtonId == R.id.rb_battery_discharging) { - status = BatteryManager.BATTERY_STATUS_DISCHARGING - description = if (keepReminding) { - String.format(getString(R.string.battery_discharged_below), levelMin.toString()) - } else { - String.format(getString(R.string.battery_discharged_to), levelMin.toString()) + val status: Int = when (binding!!.rgStatus.checkedRadioButtonId) { + R.id.rb_battery_discharging -> { + description = if (keepReminding) { + String.format(getString(R.string.battery_discharged_below), levelMin.toString()) + } else { + String.format(getString(R.string.battery_discharged_to), levelMin.toString()) + } + BatteryManager.BATTERY_STATUS_DISCHARGING } - } else { - status = BatteryManager.BATTERY_STATUS_CHARGING - description = if (keepReminding) { - String.format(getString(R.string.battery_charged_above), levelMax.toString()) - } else { - String.format(getString(R.string.battery_charged_to), levelMax.toString()) + + else -> { + description = if (keepReminding) { + String.format(getString(R.string.battery_charged_above), levelMax.toString()) + } else { + String.format(getString(R.string.battery_charged_to), levelMax.toString()) + } + BatteryManager.BATTERY_STATUS_CHARGING } } + + if (updateView) { + binding!!.tvDescription.text = description + } + return BatterySetting(description, status, levelMin, levelMax, keepReminding) } } \ No newline at end of file diff --git a/app/src/main/java/com/idormy/sms/forwarder/fragment/condition/ChargeFragment.kt b/app/src/main/java/com/idormy/sms/forwarder/fragment/condition/ChargeFragment.kt index 255ce625..a58b3351 100644 --- a/app/src/main/java/com/idormy/sms/forwarder/fragment/condition/ChargeFragment.kt +++ b/app/src/main/java/com/idormy/sms/forwarder/fragment/condition/ChargeFragment.kt @@ -14,15 +14,12 @@ import com.idormy.sms.forwarder.entity.task.ChargeSetting import com.idormy.sms.forwarder.utils.KEY_BACK_DATA_CONDITION import com.idormy.sms.forwarder.utils.KEY_BACK_DESCRIPTION_CONDITION import com.idormy.sms.forwarder.utils.KEY_EVENT_DATA_CONDITION -import com.idormy.sms.forwarder.utils.KEY_TEST_CONDITION import com.idormy.sms.forwarder.utils.TASK_CONDITION_CHARGE import com.idormy.sms.forwarder.utils.XToastUtils -import com.jeremyliao.liveeventbus.LiveEventBus import com.xuexiang.xaop.annotation.SingleClick import com.xuexiang.xpage.annotation.Page import com.xuexiang.xrouter.annotation.AutoWired import com.xuexiang.xrouter.launcher.XRouter -import com.xuexiang.xui.utils.CountDownButtonHelper import com.xuexiang.xui.widget.actionbar.TitleBar @Page(name = "Charge") @@ -31,7 +28,6 @@ class ChargeFragment : BaseFragment(), Vie private val TAG: String = ChargeFragment::class.java.simpleName var titleBar: TitleBar? = null - private var mCountDownHelper: CountDownButtonHelper? = null @JvmField @AutoWired(name = KEY_EVENT_DATA_CONDITION) @@ -57,22 +53,11 @@ class ChargeFragment : BaseFragment(), Vie * 初始化控件 */ override fun initViews() { - //测试按钮增加倒计时,避免重复点击 - mCountDownHelper = CountDownButtonHelper(binding!!.btnTest, 3) - 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) - } - }) - Log.d(TAG, "initViews eventData:$eventData") if (eventData != null) { val settingVo = Gson().fromJson(eventData, ChargeSetting::class.java) Log.d(TAG, "initViews settingVo:$settingVo") + binding!!.tvDescription.text = settingVo.description binding!!.rgStatus.check(settingVo.getStatusCheckId()) binding!!.rgPlugged.check(settingVo.getPluggedCheckId()) } @@ -80,17 +65,13 @@ class ChargeFragment : BaseFragment(), Vie @SuppressLint("SetTextI18n") override fun initListeners() { - binding!!.btnTest.setOnClickListener(this) binding!!.btnDel.setOnClickListener(this) binding!!.btnSave.setOnClickListener(this) - LiveEventBus.get(KEY_TEST_CONDITION, String::class.java).observe(this) { - mCountDownHelper?.finish() - - if (it == "success") { - XToastUtils.success("测试通过", 30000) - } else { - XToastUtils.error(it, 30000) - } + binding!!.rgStatus.setOnCheckedChangeListener { _, _ -> + checkSetting(true) + } + binding!!.rgPlugged.setOnCheckedChangeListener { _, _ -> + checkSetting(true) } } @@ -98,20 +79,6 @@ class ChargeFragment : BaseFragment(), Vie override fun onClick(v: View) { try { when (v.id) { - R.id.btn_test -> { - mCountDownHelper?.start() - Thread { - try { - val settingVo = checkSetting() - Log.d(TAG, settingVo.toString()) - LiveEventBus.get(KEY_TEST_CONDITION, String::class.java).post("success") - } catch (e: Exception) { - LiveEventBus.get(KEY_TEST_CONDITION, String::class.java).post(e.message.toString()) - e.printStackTrace() - } - }.start() - return - } R.id.btn_del -> { popToBack() @@ -135,9 +102,15 @@ class ChargeFragment : BaseFragment(), Vie } //检查设置 - private fun checkSetting(): ChargeSetting { + private fun checkSetting(updateView: Boolean = false): ChargeSetting { val statusCheckId = binding!!.rgStatus.checkedRadioButtonId val pluggedCheckId = binding!!.rgPlugged.checkedRadioButtonId - return ChargeSetting(statusCheckId = statusCheckId, pluggedCheckId = pluggedCheckId) + val settingVo = ChargeSetting(statusCheckId = statusCheckId, pluggedCheckId = pluggedCheckId) + + if (updateView) { + binding!!.tvDescription.text = settingVo.description + } + + return settingVo } } \ No newline at end of file diff --git a/app/src/main/java/com/idormy/sms/forwarder/fragment/condition/CronFragment.kt b/app/src/main/java/com/idormy/sms/forwarder/fragment/condition/CronFragment.kt index c0ef98d9..41b7b6f3 100644 --- a/app/src/main/java/com/idormy/sms/forwarder/fragment/condition/CronFragment.kt +++ b/app/src/main/java/com/idormy/sms/forwarder/fragment/condition/CronFragment.kt @@ -116,6 +116,7 @@ class CronFragment : BaseFragment(), View.On Log.d(TAG, "initViews eventData:$eventData") if (eventData != null) { val settingVo = Gson().fromJson(eventData, CronSetting::class.java) + binding!!.tvDescription.text = settingVo.description expression = settingVo.expression Log.d(TAG, "initViews expression:$expression") @@ -159,6 +160,7 @@ class CronFragment : BaseFragment(), View.On nextTimeList.add(dateFormat.format(nextDate)) times++ } + binding!!.tvDescription.text = description binding!!.tvCronExpressionCheckTips.text = "$expression\n$description" binding!!.tvNextTimeList.text = String.format(getString(R.string.next_execution_times), times.toString(), nextTimeList.joinToString("\n")) binding!!.tvNextTimeList.visibility = View.VISIBLE @@ -235,13 +237,6 @@ class CronFragment : BaseFragment(), View.On afterSecondChanged() } } - /*binding!!.etSecond.addTextChangedListener(object : TextWatcher { - override fun beforeTextChanged(s: CharSequence, start: Int, count: Int, after: Int) {} - override fun onTextChanged(s: CharSequence, start: Int, before: Int, count: Int) {} - override fun afterTextChanged(s: Editable) { - afterSecondChanged() - } - })*/ binding!!.etSecond.setText(second) afterSecondChanged() @@ -405,13 +400,6 @@ class CronFragment : BaseFragment(), View.On afterMinuteChanged() } } - /*binding!!.etMinute.addTextChangedListener(object : TextWatcher { - override fun beforeTextChanged(s: CharSequence, start: Int, count: Int, after: Int) {} - override fun onTextChanged(s: CharSequence, start: Int, before: Int, count: Int) {} - override fun afterTextChanged(s: Editable) { - afterMinuteChanged() - } - })*/ binding!!.etMinute.setText(minute) afterMinuteChanged() @@ -575,13 +563,6 @@ class CronFragment : BaseFragment(), View.On afterHourChanged() } } - /*binding!!.etHour.addTextChangedListener(object : TextWatcher { - override fun beforeTextChanged(s: CharSequence, start: Int, count: Int, after: Int) {} - override fun onTextChanged(s: CharSequence, start: Int, before: Int, count: Int) {} - override fun afterTextChanged(s: Editable) { - afterHourChanged() - } - })*/ binding!!.etHour.setText(hour) afterHourChanged() @@ -745,13 +726,6 @@ class CronFragment : BaseFragment(), View.On afterDayChanged() } } - /*binding!!.etDay.addTextChangedListener(object : TextWatcher { - override fun beforeTextChanged(s: CharSequence, start: Int, count: Int, after: Int) {} - override fun onTextChanged(s: CharSequence, start: Int, before: Int, count: Int) {} - override fun afterTextChanged(s: Editable) { - afterDayChanged() - } - })*/ binding!!.etDay.setText(day) afterDayChanged() @@ -961,13 +935,6 @@ class CronFragment : BaseFragment(), View.On afterMonthChanged() } } - /*binding!!.etMonth.addTextChangedListener(object : TextWatcher { - override fun beforeTextChanged(s: CharSequence, start: Int, count: Int, after: Int) {} - override fun onTextChanged(s: CharSequence, start: Int, before: Int, count: Int) {} - override fun afterTextChanged(s: Editable) { - afterMonthChanged() - } - })*/ binding!!.etMonth.setText(month) afterMonthChanged() @@ -1130,13 +1097,6 @@ class CronFragment : BaseFragment(), View.On afterWeekChanged() } } - /*binding!!.etWeek.addTextChangedListener(object : TextWatcher { - override fun beforeTextChanged(s: CharSequence, start: Int, count: Int, after: Int) {} - override fun onTextChanged(s: CharSequence, start: Int, before: Int, count: Int) {} - override fun afterTextChanged(s: Editable) { - afterWeekChanged() - } - })*/ binding!!.etWeek.setText(week) afterWeekChanged() @@ -1346,13 +1306,6 @@ class CronFragment : BaseFragment(), View.On afterYearChanged() } } - /*binding!!.etYear.addTextChangedListener(object : TextWatcher { - override fun beforeTextChanged(s: CharSequence, start: Int, count: Int, after: Int) {} - override fun onTextChanged(s: CharSequence, start: Int, before: Int, count: Int) {} - override fun afterTextChanged(s: Editable) { - afterYearChanged() - } - })*/ binding!!.etYear.setText(year) afterYearChanged() diff --git a/app/src/main/java/com/idormy/sms/forwarder/fragment/condition/LeaveAddressFragment.kt b/app/src/main/java/com/idormy/sms/forwarder/fragment/condition/LeaveAddressFragment.kt index a0386889..a79afee7 100644 --- a/app/src/main/java/com/idormy/sms/forwarder/fragment/condition/LeaveAddressFragment.kt +++ b/app/src/main/java/com/idormy/sms/forwarder/fragment/condition/LeaveAddressFragment.kt @@ -2,6 +2,8 @@ package com.idormy.sms.forwarder.fragment.condition import android.annotation.SuppressLint import android.content.Intent +import android.text.Editable +import android.text.TextWatcher import android.util.Log import android.view.LayoutInflater import android.view.View @@ -17,16 +19,13 @@ import com.idormy.sms.forwarder.utils.HttpServerUtils import com.idormy.sms.forwarder.utils.KEY_BACK_DATA_CONDITION import com.idormy.sms.forwarder.utils.KEY_BACK_DESCRIPTION_CONDITION import com.idormy.sms.forwarder.utils.KEY_EVENT_DATA_CONDITION -import com.idormy.sms.forwarder.utils.KEY_TEST_CONDITION import com.idormy.sms.forwarder.utils.SettingUtils import com.idormy.sms.forwarder.utils.TASK_CONDITION_LEAVE_ADDRESS import com.idormy.sms.forwarder.utils.XToastUtils -import com.jeremyliao.liveeventbus.LiveEventBus import com.xuexiang.xaop.annotation.SingleClick import com.xuexiang.xpage.annotation.Page import com.xuexiang.xrouter.annotation.AutoWired import com.xuexiang.xrouter.launcher.XRouter -import com.xuexiang.xui.utils.CountDownButtonHelper import com.xuexiang.xui.widget.actionbar.TitleBar import com.xuexiang.xui.widget.dialog.materialdialog.DialogAction import com.xuexiang.xui.widget.dialog.materialdialog.MaterialDialog @@ -37,7 +36,6 @@ class LeaveAddressFragment : BaseFragment if (checkedId == R.id.rb_calc_type_distance) { binding!!.layoutCalcTypeDistance.visibility = View.VISIBLE @@ -85,35 +71,93 @@ class LeaveAddressFragment : BaseFragment { if (!App.LocationClient.isStarted()) { - MaterialDialog.Builder(requireContext()) - .iconRes(R.drawable.auto_task_icon_location) - .title(R.string.enable_location) - .content(R.string.enable_location_dialog) - .cancelable(false) - .positiveText(R.string.lab_yes) - .negativeText(R.string.lab_no).onPositive { _: MaterialDialog?, _: DialogAction? -> - SettingUtils.enableLocation = true - val serviceIntent = Intent(requireContext(), LocationService::class.java) - serviceIntent.action = "START" - requireContext().startService(serviceIntent) - }.show() + MaterialDialog.Builder(requireContext()).iconRes(R.drawable.auto_task_icon_location).title(R.string.enable_location).content(R.string.enable_location_dialog).cancelable(false).positiveText(R.string.lab_yes).negativeText(R.string.lab_no).onPositive { _: MaterialDialog?, _: DialogAction? -> + SettingUtils.enableLocation = true + val serviceIntent = Intent(requireContext(), LocationService::class.java) + serviceIntent.action = "START" + requireContext().startService(serviceIntent) + }.show() return } @@ -148,21 +186,6 @@ class LeaveAddressFragment : BaseFragment { - mCountDownHelper?.start() - Thread { - try { - val settingVo = checkSetting() - Log.d(TAG, settingVo.toString()) - LiveEventBus.get(KEY_TEST_CONDITION, String::class.java).post("success") - } catch (e: Exception) { - LiveEventBus.get(KEY_TEST_CONDITION, String::class.java).post(e.message.toString()) - e.printStackTrace() - } - }.start() - return - } - R.id.btn_del -> { popToBack() return @@ -186,25 +209,36 @@ class LeaveAddressFragment : BaseFragment { + Log.d(TAG, "longitude:$longitude latitude:$latitude distance:$distance") + if (latitude.isNaN() || longitude.isNaN() || distance.isNaN()) { + throw Exception(getString(R.string.calc_type_distance_error)) + } + description = String.format(getString(R.string.to_address_distance_description), longitude, latitude, distance) + "distance" } - description = String.format(getString(R.string.leave_address_distance_description), longitude, latitude, distance) - } else if (binding!!.rbCalcTypeAddress.isChecked) { - if (address.isEmpty()) { - throw Exception(getString(R.string.calc_type_address_error)) + + else -> { + if (address.isEmpty()) { + throw Exception(getString(R.string.calc_type_address_error)) + } + description = String.format(getString(R.string.to_address_keyword_description), address) + "address" } - description = String.format(getString(R.string.leave_address_keyword_description), address) - calcType = "address" } - return LocationSetting(description, "leave", calcType, longitude, latitude, distance, address) + val settingVo = LocationSetting(description, "leave", calcType, longitude, latitude, distance, address) + + if (updateView) { + binding!!.tvDescription.text = description + } + + return settingVo } } \ No newline at end of file diff --git a/app/src/main/java/com/idormy/sms/forwarder/fragment/condition/LockScreenFragment.kt b/app/src/main/java/com/idormy/sms/forwarder/fragment/condition/LockScreenFragment.kt index a4959a8d..e7687b69 100644 --- a/app/src/main/java/com/idormy/sms/forwarder/fragment/condition/LockScreenFragment.kt +++ b/app/src/main/java/com/idormy/sms/forwarder/fragment/condition/LockScreenFragment.kt @@ -14,15 +14,12 @@ import com.idormy.sms.forwarder.entity.task.LockScreenSetting import com.idormy.sms.forwarder.utils.KEY_BACK_DATA_CONDITION import com.idormy.sms.forwarder.utils.KEY_BACK_DESCRIPTION_CONDITION import com.idormy.sms.forwarder.utils.KEY_EVENT_DATA_CONDITION -import com.idormy.sms.forwarder.utils.KEY_TEST_CONDITION import com.idormy.sms.forwarder.utils.TASK_CONDITION_LOCK_SCREEN import com.idormy.sms.forwarder.utils.XToastUtils -import com.jeremyliao.liveeventbus.LiveEventBus import com.xuexiang.xaop.annotation.SingleClick import com.xuexiang.xpage.annotation.Page import com.xuexiang.xrouter.annotation.AutoWired import com.xuexiang.xrouter.launcher.XRouter -import com.xuexiang.xui.utils.CountDownButtonHelper import com.xuexiang.xui.widget.actionbar.TitleBar @Page(name = "LockScreen") @@ -31,7 +28,6 @@ class LockScreenFragment : BaseFragment if (checkedId == R.id.rb_action_screen_off) { binding!!.xsbTimeAfterScreenOff.visibility = View.VISIBLE @@ -77,15 +61,17 @@ class LockScreenFragment : BaseFragment + checkSetting(true) + } + binding!!.xsbTimeAfterScreenOn.setOnSeekBarListener { _, _ -> + checkSetting(true) } } @@ -112,20 +94,6 @@ class LockScreenFragment : BaseFragment { - mCountDownHelper?.start() - Thread { - try { - val settingVo = checkSetting() - Log.d(TAG, settingVo.toString()) - LiveEventBus.get(KEY_TEST_CONDITION, String::class.java).post("success") - } catch (e: Exception) { - LiveEventBus.get(KEY_TEST_CONDITION, String::class.java).post(e.message.toString()) - e.printStackTrace() - } - }.start() - return - } R.id.btn_del -> { popToBack() @@ -150,10 +118,16 @@ class LockScreenFragment : BaseFragment(), V private val TAG: String = NetworkFragment::class.java.simpleName var titleBar: TitleBar? = null - private var mCountDownHelper: CountDownButtonHelper? = null @JvmField @AutoWired(name = KEY_EVENT_DATA_CONDITION) @@ -57,68 +55,45 @@ class NetworkFragment : BaseFragment(), V * 初始化控件 */ override fun initViews() { - //测试按钮增加倒计时,避免重复点击 - mCountDownHelper = CountDownButtonHelper(binding!!.btnTest, 3) - 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) - } - }) binding!!.rgNetworkState.setOnCheckedChangeListener { _, checkedId -> Log.d(TAG, "rgNetworkState checkedId:$checkedId") binding!!.layoutDataSimSlot.visibility = if (checkedId == R.id.rb_net_mobile) View.VISIBLE else View.GONE binding!!.layoutWifiSsid.visibility = if (checkedId == R.id.rb_net_wifi) View.VISIBLE else View.GONE + checkSetting(true) } Log.d(TAG, "initViews eventData:$eventData") if (eventData != null) { val settingVo = Gson().fromJson(eventData, NetworkSetting::class.java) Log.d(TAG, "initViews settingVo:$settingVo") - binding!!.rgNetworkState.check(settingVo.getNetworkStateCheckId()) + binding!!.tvDescription.text = settingVo.description binding!!.rgDataSimSlot.check(settingVo.getDataSimSlotCheckId()) binding!!.etWifiSsid.setText(settingVo.wifiSsid) + binding!!.rgNetworkState.check(settingVo.getNetworkStateCheckId()) } } @SuppressLint("SetTextI18n") override fun initListeners() { - binding!!.btnTest.setOnClickListener(this) binding!!.btnDel.setOnClickListener(this) binding!!.btnSave.setOnClickListener(this) - LiveEventBus.get(KEY_TEST_CONDITION, String::class.java).observe(this) { - mCountDownHelper?.finish() - - if (it == "success") { - XToastUtils.success("测试通过", 30000) - } else { - XToastUtils.error(it, 30000) - } + binding!!.rgDataSimSlot.setOnCheckedChangeListener { _, _ -> + checkSetting(true) } + binding!!.etWifiSsid.addTextChangedListener(object : TextWatcher { + override fun beforeTextChanged(s: CharSequence?, start: Int, count: Int, after: Int) {} + override fun onTextChanged(s: CharSequence?, start: Int, before: Int, count: Int) {} + override fun afterTextChanged(s: Editable?) { + checkSetting(true) + } + }) } @SingleClick override fun onClick(v: View) { try { when (v.id) { - R.id.btn_test -> { - mCountDownHelper?.start() - Thread { - try { - val settingVo = checkSetting() - Log.d(TAG, settingVo.toString()) - LiveEventBus.get(KEY_TEST_CONDITION, String::class.java).post("success") - } catch (e: Exception) { - LiveEventBus.get(KEY_TEST_CONDITION, String::class.java).post(e.message.toString()) - e.printStackTrace() - } - }.start() - return - } R.id.btn_del -> { popToBack() @@ -142,10 +117,16 @@ class NetworkFragment : BaseFragment(), V } //检查设置 - private fun checkSetting(): NetworkSetting { + private fun checkSetting(updateView: Boolean = false): NetworkSetting { val networkStateCheckId = binding!!.rgNetworkState.checkedRadioButtonId val dataSimSlotCheckId = binding!!.rgDataSimSlot.checkedRadioButtonId val wifiSsid = binding!!.etWifiSsid.text.toString().trim() - return NetworkSetting(networkStateCheckId, dataSimSlotCheckId, wifiSsid) + val settingVo = NetworkSetting(networkStateCheckId, dataSimSlotCheckId, wifiSsid) + + if (updateView) { + binding!!.tvDescription.text = settingVo.description + } + + return settingVo } } \ No newline at end of file diff --git a/app/src/main/java/com/idormy/sms/forwarder/fragment/condition/SimFragment.kt b/app/src/main/java/com/idormy/sms/forwarder/fragment/condition/SimFragment.kt index cb20f716..56f2b184 100644 --- a/app/src/main/java/com/idormy/sms/forwarder/fragment/condition/SimFragment.kt +++ b/app/src/main/java/com/idormy/sms/forwarder/fragment/condition/SimFragment.kt @@ -14,15 +14,12 @@ import com.idormy.sms.forwarder.entity.task.SimSetting import com.idormy.sms.forwarder.utils.KEY_BACK_DATA_CONDITION import com.idormy.sms.forwarder.utils.KEY_BACK_DESCRIPTION_CONDITION import com.idormy.sms.forwarder.utils.KEY_EVENT_DATA_CONDITION -import com.idormy.sms.forwarder.utils.KEY_TEST_CONDITION import com.idormy.sms.forwarder.utils.TASK_CONDITION_SIM import com.idormy.sms.forwarder.utils.XToastUtils -import com.jeremyliao.liveeventbus.LiveEventBus import com.xuexiang.xaop.annotation.SingleClick import com.xuexiang.xpage.annotation.Page import com.xuexiang.xrouter.annotation.AutoWired import com.xuexiang.xrouter.launcher.XRouter -import com.xuexiang.xui.utils.CountDownButtonHelper import com.xuexiang.xui.widget.actionbar.TitleBar @Page(name = "Sim") @@ -31,7 +28,6 @@ class SimFragment : BaseFragment(), View.OnCl private val TAG: String = SimFragment::class.java.simpleName var titleBar: TitleBar? = null - private var mCountDownHelper: CountDownButtonHelper? = null @JvmField @AutoWired(name = KEY_EVENT_DATA_CONDITION) @@ -57,39 +53,21 @@ class SimFragment : BaseFragment(), View.OnCl * 初始化控件 */ override fun initViews() { - //测试按钮增加倒计时,避免重复点击 - mCountDownHelper = CountDownButtonHelper(binding!!.btnTest, 3) - 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) - } - }) - Log.d(TAG, "initViews eventData:$eventData") if (eventData != null) { val settingVo = Gson().fromJson(eventData, SimSetting::class.java) Log.d(TAG, "initViews settingVo:$settingVo") + binding!!.tvDescription.text = settingVo.description binding!!.rgSimState.check(settingVo.getSimStateCheckId()) } } @SuppressLint("SetTextI18n") override fun initListeners() { - binding!!.btnTest.setOnClickListener(this) binding!!.btnDel.setOnClickListener(this) binding!!.btnSave.setOnClickListener(this) - LiveEventBus.get(KEY_TEST_CONDITION, String::class.java).observe(this) { - mCountDownHelper?.finish() - - if (it == "success") { - XToastUtils.success("测试通过", 30000) - } else { - XToastUtils.error(it, 30000) - } + binding!!.rgSimState.setOnCheckedChangeListener { _, _ -> + checkSetting(true) } } @@ -97,20 +75,6 @@ class SimFragment : BaseFragment(), View.OnCl override fun onClick(v: View) { try { when (v.id) { - R.id.btn_test -> { - mCountDownHelper?.start() - Thread { - try { - val settingVo = checkSetting() - Log.d(TAG, settingVo.toString()) - LiveEventBus.get(KEY_TEST_CONDITION, String::class.java).post("success") - } catch (e: Exception) { - LiveEventBus.get(KEY_TEST_CONDITION, String::class.java).post(e.message.toString()) - e.printStackTrace() - } - }.start() - return - } R.id.btn_del -> { popToBack() @@ -134,8 +98,14 @@ class SimFragment : BaseFragment(), View.OnCl } //检查设置 - private fun checkSetting(): SimSetting { + private fun checkSetting(updateView: Boolean = false): SimSetting { val simStateCheckId = binding!!.rgSimState.checkedRadioButtonId - return SimSetting(simStateCheckId) + val settingVo = SimSetting(simStateCheckId) + + if (updateView) { + binding!!.tvDescription.text = settingVo.description + } + + return settingVo } } \ No newline at end of file diff --git a/app/src/main/java/com/idormy/sms/forwarder/fragment/condition/ToAddressFragment.kt b/app/src/main/java/com/idormy/sms/forwarder/fragment/condition/ToAddressFragment.kt index 988aa855..284658e4 100644 --- a/app/src/main/java/com/idormy/sms/forwarder/fragment/condition/ToAddressFragment.kt +++ b/app/src/main/java/com/idormy/sms/forwarder/fragment/condition/ToAddressFragment.kt @@ -2,6 +2,8 @@ package com.idormy.sms.forwarder.fragment.condition import android.annotation.SuppressLint import android.content.Intent +import android.text.Editable +import android.text.TextWatcher import android.util.Log import android.view.LayoutInflater import android.view.View @@ -17,16 +19,13 @@ import com.idormy.sms.forwarder.utils.HttpServerUtils import com.idormy.sms.forwarder.utils.KEY_BACK_DATA_CONDITION import com.idormy.sms.forwarder.utils.KEY_BACK_DESCRIPTION_CONDITION import com.idormy.sms.forwarder.utils.KEY_EVENT_DATA_CONDITION -import com.idormy.sms.forwarder.utils.KEY_TEST_CONDITION import com.idormy.sms.forwarder.utils.SettingUtils import com.idormy.sms.forwarder.utils.TASK_CONDITION_TO_ADDRESS import com.idormy.sms.forwarder.utils.XToastUtils -import com.jeremyliao.liveeventbus.LiveEventBus import com.xuexiang.xaop.annotation.SingleClick import com.xuexiang.xpage.annotation.Page import com.xuexiang.xrouter.annotation.AutoWired import com.xuexiang.xrouter.launcher.XRouter -import com.xuexiang.xui.utils.CountDownButtonHelper import com.xuexiang.xui.widget.actionbar.TitleBar import com.xuexiang.xui.widget.dialog.materialdialog.DialogAction import com.xuexiang.xui.widget.dialog.materialdialog.MaterialDialog @@ -37,7 +36,6 @@ class ToAddressFragment : BaseFragment( private val TAG: String = ToAddressFragment::class.java.simpleName var titleBar: TitleBar? = null - private var mCountDownHelper: CountDownButtonHelper? = null @JvmField @AutoWired(name = KEY_EVENT_DATA_CONDITION) @@ -65,18 +63,6 @@ class ToAddressFragment : BaseFragment( * 初始化控件 */ override fun initViews() { - //测试按钮增加倒计时,避免重复点击 - mCountDownHelper = CountDownButtonHelper(binding!!.btnTest, 3) - 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) - } - }) - binding!!.rgCalcType.setOnCheckedChangeListener { _, checkedId -> if (checkedId == R.id.rb_calc_type_distance) { binding!!.layoutCalcTypeDistance.visibility = View.VISIBLE @@ -85,35 +71,93 @@ class ToAddressFragment : BaseFragment( binding!!.layoutCalcTypeDistance.visibility = View.GONE binding!!.layoutCalcTypeAddress.visibility = View.VISIBLE } + try { + checkSetting(true) + } catch (e: Exception) { + e.printStackTrace() + } } Log.d(TAG, "initViews eventData:$eventData") if (eventData != null) { val settingVo = Gson().fromJson(eventData, LocationSetting::class.java) Log.d(TAG, "initViews settingVo:$settingVo") - binding!!.rgCalcType.check(settingVo.getCalcTypeCheckId()) + binding!!.tvDescription.text = settingVo.description binding!!.etLongitude.setText(settingVo.longitude.toString()) binding!!.etLatitude.setText(settingVo.latitude.toString()) binding!!.etDistance.setText(settingVo.distance.toString()) binding!!.etAddress.setText(settingVo.address) + binding!!.rgCalcType.check(settingVo.getCalcTypeCheckId()) } } @SuppressLint("SetTextI18n") override fun initListeners() { - binding!!.btnTest.setOnClickListener(this) binding!!.btnDel.setOnClickListener(this) binding!!.btnSave.setOnClickListener(this) binding!!.btnCurrentCoordinates.setOnClickListener(this) - LiveEventBus.get(KEY_TEST_CONDITION, String::class.java).observe(this) { - mCountDownHelper?.finish() - - if (it == "success") { - XToastUtils.success("测试通过", 30000) - } else { - XToastUtils.error(it, 30000) + binding!!.etLongitude.addTextChangedListener(object : TextWatcher { + override fun beforeTextChanged(s: CharSequence?, start: Int, count: Int, after: Int) {} + override fun onTextChanged(s: CharSequence?, start: Int, before: Int, count: Int) {} + override fun afterTextChanged(s: Editable?) { + try { + val changedText = s.toString() + if (changedText.isEmpty()) { + binding!!.etLongitude.setText("0") + binding!!.etLongitude.setSelection(binding!!.etLongitude.text.length) // 将光标移至文本末尾 + } else { + checkSetting(true) + } + } catch (e: Exception) { + e.printStackTrace() + } } - } + }) + binding!!.etLatitude.addTextChangedListener(object : TextWatcher { + override fun beforeTextChanged(s: CharSequence?, start: Int, count: Int, after: Int) {} + override fun onTextChanged(s: CharSequence?, start: Int, before: Int, count: Int) {} + override fun afterTextChanged(s: Editable?) { + try { + val changedText = s.toString() + if (changedText.isEmpty()) { + binding!!.etLatitude.setText("0") + binding!!.etLatitude.setSelection(binding!!.etLatitude.text.length) // 将光标移至文本末尾 + } else { + checkSetting(true) + } + } catch (e: Exception) { + e.printStackTrace() + } + } + }) + binding!!.etDistance.addTextChangedListener(object : TextWatcher { + override fun beforeTextChanged(s: CharSequence?, start: Int, count: Int, after: Int) {} + override fun onTextChanged(s: CharSequence?, start: Int, before: Int, count: Int) {} + override fun afterTextChanged(s: Editable?) { + try { + val changedText = s.toString() + if (changedText.isEmpty()) { + binding!!.etDistance.setText("1") + binding!!.etDistance.setSelection(binding!!.etDistance.text.length) // 将光标移至文本末尾 + } else { + checkSetting(true) + } + } catch (e: Exception) { + e.printStackTrace() + } + } + }) + binding!!.etAddress.addTextChangedListener(object : TextWatcher { + override fun beforeTextChanged(s: CharSequence?, start: Int, count: Int, after: Int) {} + override fun onTextChanged(s: CharSequence?, start: Int, before: Int, count: Int) {} + override fun afterTextChanged(s: Editable?) { + try { + checkSetting(true) + } catch (e: Exception) { + e.printStackTrace() + } + } + }) } @SingleClick @@ -122,18 +166,12 @@ class ToAddressFragment : BaseFragment( when (v.id) { R.id.btn_current_coordinates -> { if (!App.LocationClient.isStarted()) { - MaterialDialog.Builder(requireContext()) - .iconRes(R.drawable.auto_task_icon_location) - .title(R.string.enable_location) - .content(R.string.enable_location_dialog) - .cancelable(false) - .positiveText(R.string.lab_yes) - .negativeText(R.string.lab_no).onPositive { _: MaterialDialog?, _: DialogAction? -> - SettingUtils.enableLocation = true - val serviceIntent = Intent(requireContext(), LocationService::class.java) - serviceIntent.action = "START" - requireContext().startService(serviceIntent) - }.show() + MaterialDialog.Builder(requireContext()).iconRes(R.drawable.auto_task_icon_location).title(R.string.enable_location).content(R.string.enable_location_dialog).cancelable(false).positiveText(R.string.lab_yes).negativeText(R.string.lab_no).onPositive { _: MaterialDialog?, _: DialogAction? -> + SettingUtils.enableLocation = true + val serviceIntent = Intent(requireContext(), LocationService::class.java) + serviceIntent.action = "START" + requireContext().startService(serviceIntent) + }.show() return } @@ -148,21 +186,6 @@ class ToAddressFragment : BaseFragment( XToastUtils.success(String.format(getString(R.string.current_address), location.address), 30000) } - R.id.btn_test -> { - mCountDownHelper?.start() - Thread { - try { - val settingVo = checkSetting() - Log.d(TAG, settingVo.toString()) - LiveEventBus.get(KEY_TEST_CONDITION, String::class.java).post("success") - } catch (e: Exception) { - LiveEventBus.get(KEY_TEST_CONDITION, String::class.java).post(e.message.toString()) - e.printStackTrace() - } - }.start() - return - } - R.id.btn_del -> { popToBack() return @@ -186,25 +209,36 @@ class ToAddressFragment : BaseFragment( //检查设置 @SuppressLint("SetTextI18n") - private fun checkSetting(): LocationSetting { + private fun checkSetting(updateView: Boolean = false): LocationSetting { val longitude = binding!!.etLongitude.text.toString().toDouble() val latitude = binding!!.etLatitude.text.toString().toDouble() val distance = binding!!.etDistance.text.toString().toDouble() val address = binding!!.etAddress.text.toString() - var calcType = "distance" - if (binding!!.rbCalcTypeDistance.isChecked) { - if (latitude.isNaN() || longitude.isNaN() || distance.isNaN()) { - throw Exception(getString(R.string.calc_type_address_error)) + val calcType = when (binding!!.rgCalcType.checkedRadioButtonId) { + R.id.rb_calc_type_distance -> { + Log.d(TAG, "longitude:$longitude latitude:$latitude distance:$distance") + if (latitude.isNaN() || longitude.isNaN() || distance.isNaN()) { + throw Exception(getString(R.string.calc_type_distance_error)) + } + description = String.format(getString(R.string.to_address_distance_description), longitude, latitude, distance) + "distance" } - description = String.format(getString(R.string.to_address_distance_description), longitude, latitude, distance) - } else if (binding!!.rbCalcTypeAddress.isChecked) { - if (address.isEmpty()) { - throw Exception(getString(R.string.calc_type_address_error)) + + else -> { + if (address.isEmpty()) { + throw Exception(getString(R.string.calc_type_address_error)) + } + description = String.format(getString(R.string.to_address_keyword_description), address) + "address" } - description = String.format(getString(R.string.to_address_keyword_description), address) - calcType = "address" } - return LocationSetting(description, "to", calcType, longitude, latitude, distance, address) + val settingVo = LocationSetting(description, "to", calcType, longitude, latitude, distance, address) + + if (updateView) { + binding!!.tvDescription.text = description + } + + return settingVo } } \ No newline at end of file diff --git a/app/src/main/res/layout/fragment_tasks_condition_battery.xml b/app/src/main/res/layout/fragment_tasks_condition_battery.xml index 19fc132b..93521ea2 100644 --- a/app/src/main/res/layout/fragment_tasks_condition_battery.xml +++ b/app/src/main/res/layout/fragment_tasks_condition_battery.xml @@ -37,9 +37,18 @@ + + - - \ No newline at end of file diff --git a/app/src/main/res/layout/fragment_tasks_condition_charge.xml b/app/src/main/res/layout/fragment_tasks_condition_charge.xml index 9c7ad559..3722da6b 100644 --- a/app/src/main/res/layout/fragment_tasks_condition_charge.xml +++ b/app/src/main/res/layout/fragment_tasks_condition_charge.xml @@ -37,9 +37,18 @@ + + + + + android:layout_width="match_parent" + android:layout_height="wrap_content" + android:orientation="horizontal"> - - - + - - + android:layout_width="match_parent" + android:layout_height="wrap_content" + android:orientation="horizontal"> @@ -172,17 +180,6 @@ android:textSize="11sp" tools:ignore="RtlSymmetry,TextContrastCheck,TouchTargetSizeCheck" /> - - \ No newline at end of file diff --git a/app/src/main/res/layout/fragment_tasks_condition_cron.xml b/app/src/main/res/layout/fragment_tasks_condition_cron.xml index c6b3db65..6209d015 100644 --- a/app/src/main/res/layout/fragment_tasks_condition_cron.xml +++ b/app/src/main/res/layout/fragment_tasks_condition_cron.xml @@ -37,13 +37,15 @@ diff --git a/app/src/main/res/layout/fragment_tasks_condition_leave_address.xml b/app/src/main/res/layout/fragment_tasks_condition_leave_address.xml index 63610496..4c78dafc 100644 --- a/app/src/main/res/layout/fragment_tasks_condition_leave_address.xml +++ b/app/src/main/res/layout/fragment_tasks_condition_leave_address.xml @@ -38,8 +38,17 @@ android:layout_width="match_parent" android:layout_height="wrap_content" android:text="@string/task_leave_address" + android:textSize="18sp" android:textStyle="bold" /> + + - - \ No newline at end of file diff --git a/app/src/main/res/layout/fragment_tasks_condition_lock_screen.xml b/app/src/main/res/layout/fragment_tasks_condition_lock_screen.xml index 88d76fe2..696b3373 100644 --- a/app/src/main/res/layout/fragment_tasks_condition_lock_screen.xml +++ b/app/src/main/res/layout/fragment_tasks_condition_lock_screen.xml @@ -38,8 +38,17 @@ android:layout_width="match_parent" android:layout_height="wrap_content" android:text="@string/task_lock_screen" + android:textSize="18sp" android:textStyle="bold" /> + + - - \ No newline at end of file diff --git a/app/src/main/res/layout/fragment_tasks_condition_network.xml b/app/src/main/res/layout/fragment_tasks_condition_network.xml index 6df1de13..85acc303 100644 --- a/app/src/main/res/layout/fragment_tasks_condition_network.xml +++ b/app/src/main/res/layout/fragment_tasks_condition_network.xml @@ -38,8 +38,17 @@ android:layout_width="match_parent" android:layout_height="wrap_content" android:text="@string/task_network" + android:textSize="18sp" android:textStyle="bold" /> + + - - \ No newline at end of file diff --git a/app/src/main/res/layout/fragment_tasks_condition_sim.xml b/app/src/main/res/layout/fragment_tasks_condition_sim.xml index b3ff8472..a296577a 100644 --- a/app/src/main/res/layout/fragment_tasks_condition_sim.xml +++ b/app/src/main/res/layout/fragment_tasks_condition_sim.xml @@ -38,8 +38,17 @@ android:layout_width="match_parent" android:layout_height="wrap_content" android:text="@string/task_sim" + android:textSize="18sp" android:textStyle="bold" /> + + - - \ No newline at end of file diff --git a/app/src/main/res/layout/fragment_tasks_condition_to_address.xml b/app/src/main/res/layout/fragment_tasks_condition_to_address.xml index 542c09a6..3c5a9de2 100644 --- a/app/src/main/res/layout/fragment_tasks_condition_to_address.xml +++ b/app/src/main/res/layout/fragment_tasks_condition_to_address.xml @@ -38,8 +38,17 @@ android:layout_width="match_parent" android:layout_height="wrap_content" android:text="@string/task_to_address" + android:textSize="18sp" android:textStyle="bold" /> + + - - \ 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 27904540..40052aec 100644 --- a/app/src/main/res/values-en/strings.xml +++ b/app/src/main/res/values-en/strings.xml @@ -1129,13 +1129,21 @@ Please select action Close Cron + Quartz Cron Expression To Address + Using latitude and longitude coordinates (WGS-84). Leave Address + Using latitude and longitude coordinates (WGS-84). Network + Trigger upon network status change. SIM Status + Trigger upon SIM Status change. Battery + Trigger when battery level meets condition. Charge + Trigger when charge status meets condition. Screen Off/On + Trigger upon screen lock/unlock instantly or after a set time. Send Sms Notification Frpc Setting @@ -1149,7 +1157,6 @@ Week Year Cron Expression - Quartz Cron Expression Every Second Every Minute Every Hour @@ -1201,9 +1208,9 @@ Discharged to the specified battery level Charged to the specified battery level The battery discharged to %s%% - "The battery discharged below %s%% + "The battery discharged below %s%%, keep reminding The battery charged to %s%% - The battery charged above %s%% + The battery charged above %s%%, keep reminding SIM State:%s Absent diff --git a/app/src/main/res/values/strings.xml b/app/src/main/res/values/strings.xml index 2926b1bf..7f14d6e1 100644 --- a/app/src/main/res/values/strings.xml +++ b/app/src/main/res/values/strings.xml @@ -1130,13 +1130,21 @@ 请选择动作 关 闭 定时任务 + 采用 Quartz Cron 表达式 到达地点 + 采用经纬度坐标(WGS-84坐标系) 离开地点 + 采用经纬度坐标(WGS-84坐标系) 网络状态 + 当网络状态改变时触发 SIM卡状态 + 当SIM卡状态改变时触发 电量使用 + 当剩余电量满足条件时触发 充电状态 + 当充电状态满足条件时触发 锁屏解锁 + 在屏幕锁定或解锁后立即或指定时间触发 发送短信 通道推送 Frpc设置 @@ -1150,7 +1158,6 @@ Cron表达式 - 采用 Quartz Cron 表达式 每秒钟 每分钟 每小时 @@ -1202,9 +1209,9 @@ 放电到指定电量 充电到指定电量 电池放电低到%s%% - 电池放电低于%s%% + 电池放电低于%s%%, 持续提醒 电池充电达到%s%% - 电池充电高于%s%% + 电池充电高于%s%%, 持续提醒 SIM卡状态:%s 被移除