新增:自动任务·快捷指令 (开发中)

This commit is contained in:
pppscn 2023-12-08 21:54:22 +08:00
parent 5fb9f1b75c
commit 95e9f22816
39 changed files with 1310 additions and 173 deletions

View File

@ -3,6 +3,10 @@
xmlns:tools="http://schemas.android.com/tools" xmlns:tools="http://schemas.android.com/tools"
android:installLocation="internalOnly"> android:installLocation="internalOnly">
<uses-feature
android:name="android.hardware.telephony"
android:required="false" />
<uses-permission <uses-permission
android:name="android.permission.QUERY_ALL_PACKAGES" android:name="android.permission.QUERY_ALL_PACKAGES"
tools:ignore="QueryAllPackagesPermission" /> tools:ignore="QueryAllPackagesPermission" />
@ -239,6 +243,11 @@
<action android:name="android.service.notification.NotificationListenerService" /> <action android:name="android.service.notification.NotificationListenerService" />
</intent-filter> </intent-filter>
</service> </service>
<service
android:name=".workers.CronWorker"
android:exported="false"
android:permission="android.permission.BIND_JOB_SERVICE" />
<receiver <receiver
android:name=".receiver.BootReceiver" android:name=".receiver.BootReceiver"

View File

@ -41,7 +41,11 @@ class TaskPagingAdapter(private val itemClickListener: OnItemClickListener) : Pa
for (condition in conditionList) { for (condition in conditionList) {
val layoutConditionItem = View.inflate(App.context, R.layout.item_setting, null) as LinearLayout val layoutConditionItem = View.inflate(App.context, R.layout.item_setting, null) as LinearLayout
val ivConditionIcon = layoutConditionItem.findViewById<ImageView>(R.id.iv_setting_icon) val ivConditionIcon = layoutConditionItem.findViewById<ImageView>(R.id.iv_setting_icon)
ivConditionIcon.setImageResource(condition.iconId) if (item.status == 0) {
ivConditionIcon.setImageResource(condition.greyIconId)
} else {
ivConditionIcon.setImageResource(condition.iconId)
}
holder.binding.layoutConditionsIcons.addView(layoutConditionItem) holder.binding.layoutConditionsIcons.addView(layoutConditionItem)
} }
} }
@ -50,12 +54,14 @@ class TaskPagingAdapter(private val itemClickListener: OnItemClickListener) : Pa
holder.binding.layoutActionsIcons.removeAllViews() holder.binding.layoutActionsIcons.removeAllViews()
if (item.actions.isNotEmpty()) { if (item.actions.isNotEmpty()) {
val actionList = Gson().fromJson(item.actions, Array<TaskSetting>::class.java).toMutableList() val actionList = Gson().fromJson(item.actions, Array<TaskSetting>::class.java).toMutableList()
//Log.d("TaskPagingAdapter", "actionList:$actionList")
for (action in actionList) { for (action in actionList) {
//Log.d("TaskPagingAdapter", "action:$action")
val layoutActionItem = View.inflate(App.context, R.layout.item_setting, null) as LinearLayout val layoutActionItem = View.inflate(App.context, R.layout.item_setting, null) as LinearLayout
val ivActionIcon = layoutActionItem.findViewById<ImageView>(R.id.iv_setting_icon) val ivActionIcon = layoutActionItem.findViewById<ImageView>(R.id.iv_setting_icon)
ivActionIcon.setImageResource(action.iconId) if (item.status == 0) {
ivActionIcon.setImageResource(action.greyIconId)
} else {
ivActionIcon.setImageResource(action.iconId)
}
holder.binding.layoutActionsIcons.addView(layoutActionItem) holder.binding.layoutActionsIcons.addView(layoutActionItem)
} }
} }
@ -69,7 +75,11 @@ class TaskPagingAdapter(private val itemClickListener: OnItemClickListener) : Pa
} else { } else {
holder.binding.layoutImage.visibility = View.VISIBLE holder.binding.layoutImage.visibility = View.VISIBLE
holder.binding.layoutIcons.visibility = View.GONE holder.binding.layoutIcons.visibility = View.GONE
holder.binding.ivImage.setImageResource(item.imageId) if (item.status == 0) {
holder.binding.ivImage.setImageResource(item.greyImageId)
} else {
holder.binding.ivImage.setImageResource(item.imageId)
}
holder.binding.ivStatus.setImageResource(item.statusImageId) holder.binding.ivStatus.setImageResource(item.statusImageId)
holder.binding.ivEdit.visibility = View.GONE holder.binding.ivEdit.visibility = View.GONE
holder.binding.ivDelete.visibility = View.GONE holder.binding.ivDelete.visibility = View.GONE

View File

@ -14,6 +14,7 @@ import com.idormy.sms.forwarder.utils.TASK_CONDITION_BATTERY
import com.idormy.sms.forwarder.utils.TASK_CONDITION_CHARGE import com.idormy.sms.forwarder.utils.TASK_CONDITION_CHARGE
import com.idormy.sms.forwarder.utils.TASK_CONDITION_CRON import com.idormy.sms.forwarder.utils.TASK_CONDITION_CRON
import com.idormy.sms.forwarder.utils.TASK_CONDITION_NETWORK import com.idormy.sms.forwarder.utils.TASK_CONDITION_NETWORK
import com.idormy.sms.forwarder.utils.TASK_CONDITION_SIM
import kotlinx.parcelize.Parcelize import kotlinx.parcelize.Parcelize
import java.util.Date import java.util.Date
@ -36,7 +37,8 @@ data class Task(
TASK_CONDITION_CRON -> R.drawable.auto_task_icon_custom_time TASK_CONDITION_CRON -> R.drawable.auto_task_icon_custom_time
TASK_CONDITION_BATTERY -> R.drawable.auto_task_icon_battery TASK_CONDITION_BATTERY -> R.drawable.auto_task_icon_battery
TASK_CONDITION_CHARGE -> R.drawable.auto_task_icon_charge TASK_CONDITION_CHARGE -> R.drawable.auto_task_icon_charge
TASK_CONDITION_NETWORK -> R.drawable.auto_task_icon_wlan TASK_CONDITION_NETWORK -> R.drawable.auto_task_icon_network
TASK_CONDITION_SIM -> R.drawable.auto_task_icon_sim
TASK_ACTION_SENDSMS -> R.drawable.auto_task_icon_sms TASK_ACTION_SENDSMS -> R.drawable.auto_task_icon_sms
TASK_ACTION_NOTIFICATION -> R.drawable.auto_task_icon_sender TASK_ACTION_NOTIFICATION -> R.drawable.auto_task_icon_sender
TASK_ACTION_FRPC -> R.drawable.auto_task_icon_frpc TASK_ACTION_FRPC -> R.drawable.auto_task_icon_frpc
@ -44,6 +46,20 @@ data class Task(
else -> R.drawable.auto_task_icon_custom_time else -> R.drawable.auto_task_icon_custom_time
} }
val greyImageId: Int
get() = when (type) {
TASK_CONDITION_CRON -> R.drawable.auto_task_icon_custom_time_grey
TASK_CONDITION_BATTERY -> R.drawable.auto_task_icon_battery_grey
TASK_CONDITION_CHARGE -> R.drawable.auto_task_icon_charge_grey
TASK_CONDITION_NETWORK -> R.drawable.auto_task_icon_network_grey
TASK_CONDITION_SIM -> R.drawable.auto_task_icon_sim_grey
TASK_ACTION_SENDSMS -> R.drawable.auto_task_icon_sms_grey
TASK_ACTION_NOTIFICATION -> R.drawable.auto_task_icon_sender_grey
TASK_ACTION_FRPC -> R.drawable.auto_task_icon_frpc_grey
TASK_ACTION_HTTPSERVER -> R.drawable.auto_task_icon_http_server_grey
else -> R.drawable.auto_task_icon_custom_time_grey
}
val statusImageId: Int val statusImageId: Int
get() = when (status) { get() = when (status) {
STATUS_OFF -> R.drawable.icon_off STATUS_OFF -> R.drawable.icon_off

View File

@ -0,0 +1,22 @@
package com.idormy.sms.forwarder.entity.task
import android.os.BatteryManager
import com.idormy.sms.forwarder.R
import java.io.Serializable
data class BatterySetting(
var description: String = "", //描述
var status: Int = BatteryManager.BATTERY_STATUS_CHARGING, //状态
var levelMin: Int = 1, //电量下限
var levelMax: Int = 100, //电量上限
var keepReminding: Boolean = false, //持续提醒
) : Serializable {
fun getStatusCheckId(): Int {
return when (status) {
BatteryManager.BATTERY_STATUS_CHARGING -> R.id.rb_battery_charging
BatteryManager.BATTERY_STATUS_DISCHARGING -> R.id.rb_battery_discharging
else -> R.id.rb_battery_charging
}
}
}

View File

@ -0,0 +1,74 @@
package com.idormy.sms.forwarder.entity.task
import android.os.BatteryManager
import com.idormy.sms.forwarder.R
import com.xuexiang.xui.utils.ResUtils
import com.xuexiang.xutil.resource.ResUtils.getString
import java.io.Serializable
@Suppress("DEPRECATION", "unused")
data class ChargeSetting(
var description: String = "", //描述
var status: Int = BatteryManager.BATTERY_STATUS_UNKNOWN, //状态
var plugged: Int = BatteryManager.BATTERY_PLUGGED_AC, //充电方式
) : Serializable {
constructor(statusCheckId: Int, pluggedCheckId: Int) : this() {
status = when (statusCheckId) {
R.id.rb_battery_charging -> BatteryManager.BATTERY_STATUS_CHARGING
R.id.rb_battery_discharging -> BatteryManager.BATTERY_STATUS_DISCHARGING
R.id.rb_battery_not_charging -> BatteryManager.BATTERY_STATUS_NOT_CHARGING
R.id.rb_battery_full -> BatteryManager.BATTERY_STATUS_FULL
R.id.rb_battery_unknown -> BatteryManager.BATTERY_STATUS_UNKNOWN
else -> BatteryManager.BATTERY_STATUS_UNKNOWN
}
plugged = when (pluggedCheckId) {
R.id.rb_plugged_ac -> BatteryManager.BATTERY_PLUGGED_AC
R.id.rb_plugged_usb -> BatteryManager.BATTERY_PLUGGED_USB
R.id.rb_plugged_wireless -> BatteryManager.BATTERY_PLUGGED_WIRELESS
else -> BatteryManager.BATTERY_PLUGGED_AC
}
description = String.format(getString(R.string.battery_status), getStatusStr(status))
description += ", " + String.format(getString(R.string.battery_plugged), getPluggedStr(plugged))
}
private fun getStatusStr(status: Int): String {
return when (status) {
BatteryManager.BATTERY_STATUS_CHARGING -> ResUtils.getString(R.string.battery_charging)
BatteryManager.BATTERY_STATUS_DISCHARGING -> ResUtils.getString(R.string.battery_discharging)
BatteryManager.BATTERY_STATUS_NOT_CHARGING -> ResUtils.getString(R.string.battery_not_charging)
BatteryManager.BATTERY_STATUS_FULL -> ResUtils.getString(R.string.battery_full)
BatteryManager.BATTERY_STATUS_UNKNOWN -> ResUtils.getString(R.string.battery_unknown)
else -> ResUtils.getString(R.string.battery_unknown)
}
}
fun getStatusCheckId(): Int {
return when (status) {
BatteryManager.BATTERY_STATUS_CHARGING -> R.id.rb_battery_charging
BatteryManager.BATTERY_STATUS_DISCHARGING -> R.id.rb_battery_discharging
BatteryManager.BATTERY_STATUS_NOT_CHARGING -> R.id.rb_battery_not_charging
BatteryManager.BATTERY_STATUS_FULL -> R.id.rb_battery_full
BatteryManager.BATTERY_STATUS_UNKNOWN -> R.id.rb_battery_unknown
else -> R.id.rb_battery_charging
}
}
private fun getPluggedStr(plugged: Int): String {
return when (plugged) {
BatteryManager.BATTERY_PLUGGED_AC -> ResUtils.getString(R.string.battery_ac)
BatteryManager.BATTERY_PLUGGED_USB -> ResUtils.getString(R.string.battery_usb)
BatteryManager.BATTERY_PLUGGED_WIRELESS -> ResUtils.getString(R.string.battery_wireless)
else -> ResUtils.getString(R.string.battery_unknown)
}
}
fun getPluggedCheckId(): Int {
return when (plugged) {
BatteryManager.BATTERY_PLUGGED_AC -> R.id.rb_plugged_ac
BatteryManager.BATTERY_PLUGGED_USB -> R.id.rb_plugged_usb
BatteryManager.BATTERY_PLUGGED_WIRELESS -> R.id.rb_plugged_wireless
else -> R.id.rb_plugged_unknown
}
}
}

View File

@ -3,6 +3,6 @@ package com.idormy.sms.forwarder.entity.task
import java.io.Serializable import java.io.Serializable
data class CronSetting( data class CronSetting(
var expression: String, var description: String = "", //描述
var description: String = "", var expression: String = "", //表达式
) : Serializable ) : Serializable

View File

@ -0,0 +1,41 @@
package com.idormy.sms.forwarder.entity.task
import com.idormy.sms.forwarder.R
import com.xuexiang.xutil.resource.ResUtils.getString
import java.io.Serializable
data class NetworkSetting(
var description: String = "", //描述
var networkState: Int = 0, //网络状态0-没有网络1-移动网络2-WiFi3-以太网, 4-未知
) : Serializable {
constructor(networkStateCheckId: Int) : this() {
networkState = when (networkStateCheckId) {
R.id.rb_no_network -> 0
R.id.rb_net_mobile -> 1
R.id.rb_net_wifi -> 2
R.id.rb_net_ethernet -> 3
else -> 4
}
description = String.format(
getString(R.string.network_state),
when (networkState) {
0 -> getString(R.string.no_network)
1 -> getString(R.string.net_mobile)
2 -> getString(R.string.net_wifi)
3 -> getString(R.string.net_ethernet)
else -> getString(R.string.net_unknown)
}
)
}
fun getNetworkStateCheckId(): Int {
return when (networkState) {
0 -> R.id.rb_no_network
1 -> R.id.rb_net_mobile
2 -> R.id.rb_net_wifi
3 -> R.id.rb_net_ethernet
else -> R.id.rb_net_unknown
}
}
}

View File

@ -0,0 +1,35 @@
package com.idormy.sms.forwarder.entity.task
import com.idormy.sms.forwarder.R
import com.xuexiang.xutil.resource.ResUtils.getString
import java.io.Serializable
data class SimSetting(
var description: String = "", //描述
var simState: Int = 0, //SIM卡状态0-未知状态1-卡被移除5-卡已准备就绪
) : Serializable {
constructor(simStateCheckId: Int) : this() {
simState = when (simStateCheckId) {
R.id.rb_sim_state_absent -> 1
R.id.rb_sim_state_ready -> 5
else -> 0
}
description = String.format(
getString(R.string.sim_state),
when (simState) {
1 -> getString(R.string.sim_state_absent)
5 -> getString(R.string.sim_state_ready)
else -> getString(R.string.sim_state_unknown)
}
)
}
fun getSimStateCheckId(): Int {
return when (simState) {
1 -> R.id.rb_sim_state_absent
5 -> R.id.rb_sim_state_ready
else -> R.id.rb_sim_state_unknown
}
}
}

View File

@ -3,8 +3,8 @@ package com.idormy.sms.forwarder.entity.task
import java.io.Serializable import java.io.Serializable
data class SmsSetting( data class SmsSetting(
var description: String = "", var description: String = "", //描述
var simSlot: Int = 1, var simSlot: Int = 1, //卡槽
var phoneNumbers: String = "", var phoneNumbers: String = "", //手机号码
var msgContent: String = "", var msgContent: String = "", //短信内容
) : Serializable ) : Serializable

View File

@ -13,10 +13,10 @@ import java.io.Serializable
data class TaskSetting( data class TaskSetting(
val type: Int, // TASK_CONDITION_FRAGMENT_LIST 索引加上 KEY_BACK_CODE_CONDITION 或者 TASK_ACTION_FRAGMENT_LIST 索引加上 KEY_BACK_CODE_ACTION val type: Int, // TASK_CONDITION_FRAGMENT_LIST 索引加上 KEY_BACK_CODE_CONDITION 或者 TASK_ACTION_FRAGMENT_LIST 索引加上 KEY_BACK_CODE_ACTION
val title: String, val title: String, //标题
val description: String, val description: String, //描述
var setting: String = "", var setting: String = "", //设置
var position: Int = -1 var position: Int = -1 //位置
) : Serializable { ) : Serializable {
val iconId: Int val iconId: Int
@ -24,11 +24,24 @@ data class TaskSetting(
TASK_CONDITION_CRON -> R.drawable.auto_task_icon_custom_time TASK_CONDITION_CRON -> R.drawable.auto_task_icon_custom_time
TASK_CONDITION_BATTERY -> R.drawable.auto_task_icon_battery TASK_CONDITION_BATTERY -> R.drawable.auto_task_icon_battery
TASK_CONDITION_CHARGE -> R.drawable.auto_task_icon_charge TASK_CONDITION_CHARGE -> R.drawable.auto_task_icon_charge
TASK_CONDITION_NETWORK -> R.drawable.auto_task_icon_wlan TASK_CONDITION_NETWORK -> R.drawable.auto_task_icon_network
TASK_ACTION_SENDSMS -> R.drawable.auto_task_icon_sms TASK_ACTION_SENDSMS -> R.drawable.auto_task_icon_sms
TASK_ACTION_NOTIFICATION -> R.drawable.auto_task_icon_sender TASK_ACTION_NOTIFICATION -> R.drawable.auto_task_icon_sender
TASK_ACTION_FRPC -> R.drawable.auto_task_icon_frpc TASK_ACTION_FRPC -> R.drawable.auto_task_icon_frpc
TASK_ACTION_HTTPSERVER -> R.drawable.auto_task_icon_http_server TASK_ACTION_HTTPSERVER -> R.drawable.auto_task_icon_http_server
else -> R.drawable.auto_task_icon_sms else -> R.drawable.auto_task_icon_sms
} }
val greyIconId: Int
get() = when (type) {
TASK_CONDITION_CRON -> R.drawable.auto_task_icon_custom_time_grey
TASK_CONDITION_BATTERY -> R.drawable.auto_task_icon_battery_grey
TASK_CONDITION_CHARGE -> R.drawable.auto_task_icon_charge_grey
TASK_CONDITION_NETWORK -> R.drawable.auto_task_icon_network_grey
TASK_ACTION_SENDSMS -> R.drawable.auto_task_icon_sms_grey
TASK_ACTION_NOTIFICATION -> R.drawable.auto_task_icon_sender_grey
TASK_ACTION_FRPC -> R.drawable.auto_task_icon_frpc_grey
TASK_ACTION_HTTPSERVER -> R.drawable.auto_task_icon_http_server_grey
else -> R.drawable.auto_task_icon_sms_grey
}
} }

View File

@ -166,8 +166,10 @@ class TasksEditFragment : BaseFragment<FragmentTasksEditBinding?>(), View.OnClic
when (v.id) { when (v.id) {
R.id.layout_add_condition -> { R.id.layout_add_condition -> {
val view: View = LayoutInflater.from(requireContext()).inflate(R.layout.dialog_task_condition_bottom_sheet, null) val view: View = LayoutInflater.from(requireContext()).inflate(R.layout.dialog_task_condition_bottom_sheet, null)
val recyclerView: RecyclerView = view.findViewById(R.id.recyclerView) val tvTitle: TextView = view.findViewById(R.id.tv_title)
tvTitle.text = if (itemListConditions.isEmpty()) getString(R.string.select_task_trigger) else getString(R.string.select_task_condition)
val recyclerView: RecyclerView = view.findViewById(R.id.recyclerView)
WidgetUtils.initGridRecyclerView(recyclerView, 4, DensityUtils.dp2px(1f)) WidgetUtils.initGridRecyclerView(recyclerView, 4, DensityUtils.dp2px(1f))
val widgetItemAdapter = WidgetItemAdapter(TASK_CONDITION_FRAGMENT_LIST) val widgetItemAdapter = WidgetItemAdapter(TASK_CONDITION_FRAGMENT_LIST)
widgetItemAdapter.setOnItemClickListener(that) widgetItemAdapter.setOnItemClickListener(that)
@ -347,10 +349,6 @@ class TasksEditFragment : BaseFragment<FragmentTasksEditBinding?>(), View.OnClic
try { try {
dialog.dismiss() dialog.dismiss()
Log.d(TAG, "onItemClick: $widgetInfo") Log.d(TAG, "onItemClick: $widgetInfo")
if (pos > 0) {
XToastUtils.info("暂不支持,敬请期待……")
return
}
//判断点击的是条件还是动作 //判断点击的是条件还是动作
if (widgetInfo.classPath.contains(".condition.")) { if (widgetInfo.classPath.contains(".condition.")) {
//判断是否已经添加过该类型条件 //判断是否已经添加过该类型条件
@ -385,54 +383,18 @@ class TasksEditFragment : BaseFragment<FragmentTasksEditBinding?>(), View.OnClic
super.onFragmentResult(requestCode, resultCode, data) super.onFragmentResult(requestCode, resultCode, data)
Log.d(TAG, "requestCode:$requestCode resultCode:$resultCode data:$data") Log.d(TAG, "requestCode:$requestCode resultCode:$resultCode data:$data")
if (data != null) { if (data != null) {
val extras = data.extras val extras = data.extras ?: return
val description: String?
var setting: String? = null var setting: String? = null
if (resultCode in KEY_BACK_CODE_CONDITION..KEY_BACK_CODE_CONDITION + 999) { if (resultCode in KEY_BACK_CODE_CONDITION..KEY_BACK_CODE_CONDITION + 999) {
setting = extras!!.getString(KEY_BACK_DATA_CONDITION) setting = extras.getString(KEY_BACK_DATA_CONDITION) ?: return
if (setting == null) return
//注意TASK_CONDITION_XXX 枚举值 等于 TASK_CONDITION_FRAGMENT_LIST 索引加上 KEY_BACK_CODE_CONDITION不可改变 //注意TASK_CONDITION_XXX 枚举值 等于 TASK_CONDITION_FRAGMENT_LIST 索引加上 KEY_BACK_CODE_CONDITION不可改变
val widgetInfoIndex = resultCode - KEY_BACK_CODE_CONDITION val widgetInfoIndex = resultCode - KEY_BACK_CODE_CONDITION
if (widgetInfoIndex >= TASK_CONDITION_FRAGMENT_LIST.size) return if (widgetInfoIndex >= TASK_CONDITION_FRAGMENT_LIST.size) return
val widgetInfo = TASK_CONDITION_FRAGMENT_LIST[widgetInfoIndex] val widgetInfo = TASK_CONDITION_FRAGMENT_LIST[widgetInfoIndex]
val taskSetting: TaskSetting description = extras.getString(KEY_BACK_DESCRIPTION_CONDITION) ?: widgetInfo.name.toString()
when (resultCode) { val taskSetting = TaskSetting(resultCode, widgetInfo.name, description, setting, requestCode)
TASK_CONDITION_CRON -> {
val settingVo = Gson().fromJson(setting, CronSetting::class.java)
Log.d(TAG, settingVo.toString())
taskSetting = TaskSetting(
resultCode, widgetInfo.name, settingVo.description, setting, requestCode
)
}
TASK_CONDITION_BATTERY -> {
val settingVo = Gson().fromJson(setting, CronSetting::class.java)
Log.d(TAG, settingVo.toString())
taskSetting = TaskSetting(
resultCode, widgetInfo.name, settingVo.description, setting, requestCode
)
}
TASK_CONDITION_CHARGE -> {
val settingVo = Gson().fromJson(setting, CronSetting::class.java)
Log.d(TAG, settingVo.toString())
taskSetting = TaskSetting(
resultCode, widgetInfo.name, settingVo.description, setting, requestCode
)
}
TASK_CONDITION_NETWORK -> {
val settingVo = Gson().fromJson(setting, CronSetting::class.java)
Log.d(TAG, settingVo.toString())
taskSetting = TaskSetting(
resultCode, widgetInfo.name, settingVo.description, setting, requestCode
)
}
else -> {
return
}
}
//requestCode: 等于 itemListConditions 的索引加1 //requestCode: 等于 itemListConditions 的索引加1
if (requestCode == 0) { if (requestCode == 0) {
taskSetting.position = itemListConditions.size taskSetting.position = itemListConditions.size
@ -443,51 +405,13 @@ class TasksEditFragment : BaseFragment<FragmentTasksEditBinding?>(), View.OnClic
conditionsAdapter.notifyDataSetChanged() conditionsAdapter.notifyDataSetChanged()
binding!!.layoutAddCondition.visibility = if (itemListConditions.size >= MAX_SETTING_NUM) View.GONE else View.VISIBLE binding!!.layoutAddCondition.visibility = if (itemListConditions.size >= MAX_SETTING_NUM) View.GONE else View.VISIBLE
} else if (resultCode in KEY_BACK_CODE_ACTION..KEY_BACK_CODE_ACTION + 999) { } else if (resultCode in KEY_BACK_CODE_ACTION..KEY_BACK_CODE_ACTION + 999) {
setting = extras!!.getString(KEY_BACK_DATA_ACTION) setting = extras.getString(KEY_BACK_DATA_ACTION) ?: return
if (setting == null) return
//注意TASK_ACTION_XXX 枚举值 等于 TASK_ACTION_FRAGMENT_LIST 索引加上 KEY_BACK_CODE_ACTION不可改变 //注意TASK_ACTION_XXX 枚举值 等于 TASK_ACTION_FRAGMENT_LIST 索引加上 KEY_BACK_CODE_ACTION不可改变
val widgetInfoIndex = resultCode - KEY_BACK_CODE_ACTION val widgetInfoIndex = resultCode - KEY_BACK_CODE_ACTION
if (widgetInfoIndex >= TASK_ACTION_FRAGMENT_LIST.size) return if (widgetInfoIndex >= TASK_ACTION_FRAGMENT_LIST.size) return
val widgetInfo = TASK_ACTION_FRAGMENT_LIST[widgetInfoIndex] val widgetInfo = TASK_ACTION_FRAGMENT_LIST[widgetInfoIndex]
val taskSetting: TaskSetting description = extras.getString(KEY_BACK_DESCRIPTION_ACTION) ?: widgetInfo.name.toString()
when (resultCode) { val taskSetting = TaskSetting(resultCode, widgetInfo.name, description, setting, requestCode)
TASK_ACTION_SENDSMS -> {
val settingVo = Gson().fromJson(setting, CronSetting::class.java)
Log.d(TAG, settingVo.toString())
taskSetting = TaskSetting(
resultCode, widgetInfo.name, settingVo.description, setting, requestCode
)
}
TASK_ACTION_NOTIFICATION -> {
val settingVo = Gson().fromJson(setting, CronSetting::class.java)
Log.d(TAG, settingVo.toString())
taskSetting = TaskSetting(
resultCode, widgetInfo.name, settingVo.description, setting, requestCode
)
}
TASK_ACTION_FRPC -> {
val settingVo = Gson().fromJson(setting, CronSetting::class.java)
Log.d(TAG, settingVo.toString())
taskSetting = TaskSetting(
resultCode, widgetInfo.name, settingVo.description, setting, requestCode
)
}
TASK_ACTION_HTTPSERVER -> {
val settingVo = Gson().fromJson(setting, CronSetting::class.java)
Log.d(TAG, settingVo.toString())
taskSetting = TaskSetting(
resultCode, widgetInfo.name, settingVo.description, setting, requestCode
)
}
else -> {
return
}
}
//requestCode: 等于 itemListActions 的索引加1 //requestCode: 等于 itemListActions 的索引加1
if (requestCode == 0) { if (requestCode == 0) {
taskSetting.position = itemListActions.size taskSetting.position = itemListActions.size

View File

@ -136,6 +136,6 @@ class FrpcFragment : BaseFragment<FragmentTasksActionSendSmsBinding?>(), View.On
//检查设置 //检查设置
@SuppressLint("SetTextI18n") @SuppressLint("SetTextI18n")
private fun checkSetting(): CronSetting { private fun checkSetting(): CronSetting {
return CronSetting(expression, description) return CronSetting(description, expression)
} }
} }

View File

@ -136,6 +136,6 @@ class HttpServerFragment : BaseFragment<FragmentTasksActionSendSmsBinding?>(), V
//检查设置 //检查设置
@SuppressLint("SetTextI18n") @SuppressLint("SetTextI18n")
private fun checkSetting(): CronSetting { private fun checkSetting(): CronSetting {
return CronSetting(expression, description) return CronSetting(description, expression)
} }
} }

View File

@ -2,6 +2,7 @@ package com.idormy.sms.forwarder.fragment.condition
import android.annotation.SuppressLint import android.annotation.SuppressLint
import android.content.Intent import android.content.Intent
import android.os.BatteryManager
import android.util.Log import android.util.Log
import android.view.LayoutInflater import android.view.LayoutInflater
import android.view.View import android.view.View
@ -9,9 +10,10 @@ import android.view.ViewGroup
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.BaseFragment import com.idormy.sms.forwarder.core.BaseFragment
import com.idormy.sms.forwarder.databinding.FragmentTasksActionSendSmsBinding import com.idormy.sms.forwarder.databinding.FragmentTasksConditionBatteryBinding
import com.idormy.sms.forwarder.entity.task.CronSetting 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_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_EVENT_DATA_CONDITION
import com.idormy.sms.forwarder.utils.KEY_TEST_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.TASK_CONDITION_BATTERY
@ -26,7 +28,7 @@ import com.xuexiang.xui.widget.actionbar.TitleBar
@Page(name = "Battery") @Page(name = "Battery")
@Suppress("PrivatePropertyName") @Suppress("PrivatePropertyName")
class BatteryFragment : BaseFragment<FragmentTasksActionSendSmsBinding?>(), View.OnClickListener { class BatteryFragment : BaseFragment<FragmentTasksConditionBatteryBinding?>(), View.OnClickListener {
private val TAG: String = BatteryFragment::class.java.simpleName private val TAG: String = BatteryFragment::class.java.simpleName
var titleBar: TitleBar? = null var titleBar: TitleBar? = null
@ -36,8 +38,7 @@ class BatteryFragment : BaseFragment<FragmentTasksActionSendSmsBinding?>(), View
@AutoWired(name = KEY_EVENT_DATA_CONDITION) @AutoWired(name = KEY_EVENT_DATA_CONDITION)
var eventData: String? = null var eventData: String? = null
private var expression = "* * * * * ? *" private var description = ""
private var description = "测试描述"
override fun initArgs() { override fun initArgs() {
XRouter.getInstance().inject(this) XRouter.getInstance().inject(this)
@ -46,8 +47,8 @@ class BatteryFragment : BaseFragment<FragmentTasksActionSendSmsBinding?>(), View
override fun viewBindingInflate( override fun viewBindingInflate(
inflater: LayoutInflater, inflater: LayoutInflater,
container: ViewGroup, container: ViewGroup,
): FragmentTasksActionSendSmsBinding { ): FragmentTasksConditionBatteryBinding {
return FragmentTasksActionSendSmsBinding.inflate(inflater, container, false) return FragmentTasksConditionBatteryBinding.inflate(inflater, container, false)
} }
override fun initTitle(): TitleBar? { override fun initTitle(): TitleBar? {
@ -71,10 +72,27 @@ class BatteryFragment : BaseFragment<FragmentTasksActionSendSmsBinding?>(), View
} }
}) })
binding!!.rgStatus.setOnCheckedChangeListener { _, checkedId ->
if (checkedId == R.id.rb_battery_discharging) {
binding!!.xsbLevelMin.visibility = View.VISIBLE
binding!!.xsbLevelMax.visibility = View.GONE
} else {
binding!!.xsbLevelMin.visibility = View.GONE
binding!!.xsbLevelMax.visibility = View.VISIBLE
}
}
Log.d(TAG, "initViews eventData:$eventData") Log.d(TAG, "initViews eventData:$eventData")
if (eventData != null) { if (eventData != null) {
val settingVo = Gson().fromJson(eventData, CronSetting::class.java) val settingVo = Gson().fromJson(eventData, BatterySetting::class.java)
Log.d(TAG, "initViews settingVo:$settingVo") Log.d(TAG, "initViews settingVo:$settingVo")
binding!!.rgStatus.check(settingVo.getStatusCheckId())
binding!!.xsbLevelMin.setDefaultValue(settingVo.levelMin)
binding!!.xsbLevelMax.setDefaultValue(settingVo.levelMax)
binding!!.sbKeepReminding.isChecked = settingVo.keepReminding
} else {
binding!!.xsbLevelMin.setDefaultValue(10)
binding!!.xsbLevelMax.setDefaultValue(90)
} }
} }
@ -121,6 +139,7 @@ class BatteryFragment : BaseFragment<FragmentTasksActionSendSmsBinding?>(), View
R.id.btn_save -> { R.id.btn_save -> {
val settingVo = checkSetting() val settingVo = checkSetting()
val intent = Intent() val intent = Intent()
intent.putExtra(KEY_BACK_DESCRIPTION_CONDITION, description)
intent.putExtra(KEY_BACK_DATA_CONDITION, Gson().toJson(settingVo)) intent.putExtra(KEY_BACK_DATA_CONDITION, Gson().toJson(settingVo))
setFragmentResult(TASK_CONDITION_BATTERY, intent) setFragmentResult(TASK_CONDITION_BATTERY, intent)
popToBack() popToBack()
@ -135,7 +154,26 @@ class BatteryFragment : BaseFragment<FragmentTasksActionSendSmsBinding?>(), View
//检查设置 //检查设置
@SuppressLint("SetTextI18n") @SuppressLint("SetTextI18n")
private fun checkSetting(): CronSetting { private fun checkSetting(): BatterySetting {
return CronSetting(expression, description) 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())
}
} 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())
}
}
return BatterySetting(description, status, levelMin, levelMax, keepReminding)
} }
} }

View File

@ -9,9 +9,10 @@ import android.view.ViewGroup
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.BaseFragment import com.idormy.sms.forwarder.core.BaseFragment
import com.idormy.sms.forwarder.databinding.FragmentTasksActionSendSmsBinding import com.idormy.sms.forwarder.databinding.FragmentTasksConditionChargeBinding
import com.idormy.sms.forwarder.entity.task.CronSetting 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_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_EVENT_DATA_CONDITION
import com.idormy.sms.forwarder.utils.KEY_TEST_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.TASK_CONDITION_CHARGE
@ -26,7 +27,7 @@ import com.xuexiang.xui.widget.actionbar.TitleBar
@Page(name = "Charge") @Page(name = "Charge")
@Suppress("PrivatePropertyName") @Suppress("PrivatePropertyName")
class ChargeFragment : BaseFragment<FragmentTasksActionSendSmsBinding?>(), View.OnClickListener { class ChargeFragment : BaseFragment<FragmentTasksConditionChargeBinding?>(), View.OnClickListener {
private val TAG: String = ChargeFragment::class.java.simpleName private val TAG: String = ChargeFragment::class.java.simpleName
var titleBar: TitleBar? = null var titleBar: TitleBar? = null
@ -36,9 +37,6 @@ class ChargeFragment : BaseFragment<FragmentTasksActionSendSmsBinding?>(), View.
@AutoWired(name = KEY_EVENT_DATA_CONDITION) @AutoWired(name = KEY_EVENT_DATA_CONDITION)
var eventData: String? = null var eventData: String? = null
private var expression = "* * * * * ? *"
private var description = "测试描述"
override fun initArgs() { override fun initArgs() {
XRouter.getInstance().inject(this) XRouter.getInstance().inject(this)
} }
@ -46,8 +44,8 @@ class ChargeFragment : BaseFragment<FragmentTasksActionSendSmsBinding?>(), View.
override fun viewBindingInflate( override fun viewBindingInflate(
inflater: LayoutInflater, inflater: LayoutInflater,
container: ViewGroup, container: ViewGroup,
): FragmentTasksActionSendSmsBinding { ): FragmentTasksConditionChargeBinding {
return FragmentTasksActionSendSmsBinding.inflate(inflater, container, false) return FragmentTasksConditionChargeBinding.inflate(inflater, container, false)
} }
override fun initTitle(): TitleBar? { override fun initTitle(): TitleBar? {
@ -73,8 +71,10 @@ class ChargeFragment : BaseFragment<FragmentTasksActionSendSmsBinding?>(), View.
Log.d(TAG, "initViews eventData:$eventData") Log.d(TAG, "initViews eventData:$eventData")
if (eventData != null) { if (eventData != null) {
val settingVo = Gson().fromJson(eventData, CronSetting::class.java) val settingVo = Gson().fromJson(eventData, ChargeSetting::class.java)
Log.d(TAG, "initViews settingVo:$settingVo") Log.d(TAG, "initViews settingVo:$settingVo")
binding!!.rgStatus.check(settingVo.getStatusCheckId())
binding!!.rgPlugged.check(settingVo.getPluggedCheckId())
} }
} }
@ -121,6 +121,7 @@ class ChargeFragment : BaseFragment<FragmentTasksActionSendSmsBinding?>(), View.
R.id.btn_save -> { R.id.btn_save -> {
val settingVo = checkSetting() val settingVo = checkSetting()
val intent = Intent() val intent = Intent()
intent.putExtra(KEY_BACK_DESCRIPTION_CONDITION, settingVo.description)
intent.putExtra(KEY_BACK_DATA_CONDITION, Gson().toJson(settingVo)) intent.putExtra(KEY_BACK_DATA_CONDITION, Gson().toJson(settingVo))
setFragmentResult(TASK_CONDITION_CHARGE, intent) setFragmentResult(TASK_CONDITION_CHARGE, intent)
popToBack() popToBack()
@ -134,8 +135,9 @@ class ChargeFragment : BaseFragment<FragmentTasksActionSendSmsBinding?>(), View.
} }
//检查设置 //检查设置
@SuppressLint("SetTextI18n") private fun checkSetting(): ChargeSetting {
private fun checkSetting(): CronSetting { val statusCheckId = binding!!.rgStatus.checkedRadioButtonId
return CronSetting(expression, description) val pluggedCheckId = binding!!.rgPlugged.checkedRadioButtonId
return ChargeSetting(statusCheckId = statusCheckId, pluggedCheckId = pluggedCheckId)
} }
} }

View File

@ -16,6 +16,7 @@ import com.idormy.sms.forwarder.core.BaseFragment
import com.idormy.sms.forwarder.databinding.FragmentTasksConditionCronBinding import com.idormy.sms.forwarder.databinding.FragmentTasksConditionCronBinding
import com.idormy.sms.forwarder.entity.task.CronSetting import com.idormy.sms.forwarder.entity.task.CronSetting
import com.idormy.sms.forwarder.utils.KEY_BACK_DATA_CONDITION 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_EVENT_DATA_CONDITION
import com.idormy.sms.forwarder.utils.KEY_TEST_CONDITION import com.idormy.sms.forwarder.utils.KEY_TEST_CONDITION
import com.idormy.sms.forwarder.utils.TASK_CONDITION_CRON import com.idormy.sms.forwarder.utils.TASK_CONDITION_CRON
@ -201,6 +202,7 @@ class CronFragment : BaseFragment<FragmentTasksConditionCronBinding?>(), View.On
R.id.btn_save -> { R.id.btn_save -> {
val settingVo = checkSetting() val settingVo = checkSetting()
val intent = Intent() val intent = Intent()
intent.putExtra(KEY_BACK_DESCRIPTION_CONDITION, description)
intent.putExtra(KEY_BACK_DATA_CONDITION, Gson().toJson(settingVo)) intent.putExtra(KEY_BACK_DATA_CONDITION, Gson().toJson(settingVo))
setFragmentResult(TASK_CONDITION_CRON, intent) setFragmentResult(TASK_CONDITION_CRON, intent)
popToBack() popToBack()
@ -1644,6 +1646,6 @@ class CronFragment : BaseFragment<FragmentTasksConditionCronBinding?>(), View.On
options.isNeedSpaceBetweenWords = locale == Locale("zh") || locale == Locale("ja") || locale == Locale("ko") options.isNeedSpaceBetweenWords = locale == Locale("zh") || locale == Locale("ja") || locale == Locale("ko")
description = CronExpressionDescriptor.getDescription(expression, options, locale) description = CronExpressionDescriptor.getDescription(expression, options, locale)
return CronSetting(expression, description) return CronSetting(description, expression)
} }
} }

View File

@ -9,9 +9,10 @@ import android.view.ViewGroup
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.BaseFragment import com.idormy.sms.forwarder.core.BaseFragment
import com.idormy.sms.forwarder.databinding.FragmentTasksActionSendSmsBinding import com.idormy.sms.forwarder.databinding.FragmentTasksConditionNetworkBinding
import com.idormy.sms.forwarder.entity.task.CronSetting import com.idormy.sms.forwarder.entity.task.NetworkSetting
import com.idormy.sms.forwarder.utils.KEY_BACK_DATA_CONDITION 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_EVENT_DATA_CONDITION
import com.idormy.sms.forwarder.utils.KEY_TEST_CONDITION import com.idormy.sms.forwarder.utils.KEY_TEST_CONDITION
import com.idormy.sms.forwarder.utils.TASK_CONDITION_NETWORK import com.idormy.sms.forwarder.utils.TASK_CONDITION_NETWORK
@ -26,7 +27,7 @@ import com.xuexiang.xui.widget.actionbar.TitleBar
@Page(name = "Network") @Page(name = "Network")
@Suppress("PrivatePropertyName") @Suppress("PrivatePropertyName")
class NetworkFragment : BaseFragment<FragmentTasksActionSendSmsBinding?>(), View.OnClickListener { class NetworkFragment : BaseFragment<FragmentTasksConditionNetworkBinding?>(), View.OnClickListener {
private val TAG: String = NetworkFragment::class.java.simpleName private val TAG: String = NetworkFragment::class.java.simpleName
var titleBar: TitleBar? = null var titleBar: TitleBar? = null
@ -36,9 +37,6 @@ class NetworkFragment : BaseFragment<FragmentTasksActionSendSmsBinding?>(), View
@AutoWired(name = KEY_EVENT_DATA_CONDITION) @AutoWired(name = KEY_EVENT_DATA_CONDITION)
var eventData: String? = null var eventData: String? = null
private var expression = "* * * * * ? *"
private var description = "测试描述"
override fun initArgs() { override fun initArgs() {
XRouter.getInstance().inject(this) XRouter.getInstance().inject(this)
} }
@ -46,8 +44,8 @@ class NetworkFragment : BaseFragment<FragmentTasksActionSendSmsBinding?>(), View
override fun viewBindingInflate( override fun viewBindingInflate(
inflater: LayoutInflater, inflater: LayoutInflater,
container: ViewGroup, container: ViewGroup,
): FragmentTasksActionSendSmsBinding { ): FragmentTasksConditionNetworkBinding {
return FragmentTasksActionSendSmsBinding.inflate(inflater, container, false) return FragmentTasksConditionNetworkBinding.inflate(inflater, container, false)
} }
override fun initTitle(): TitleBar? { override fun initTitle(): TitleBar? {
@ -73,8 +71,9 @@ class NetworkFragment : BaseFragment<FragmentTasksActionSendSmsBinding?>(), View
Log.d(TAG, "initViews eventData:$eventData") Log.d(TAG, "initViews eventData:$eventData")
if (eventData != null) { if (eventData != null) {
val settingVo = Gson().fromJson(eventData, CronSetting::class.java) val settingVo = Gson().fromJson(eventData, NetworkSetting::class.java)
Log.d(TAG, "initViews settingVo:$settingVo") Log.d(TAG, "initViews settingVo:$settingVo")
binding!!.rgNetworkState.check(settingVo.getNetworkStateCheckId())
} }
} }
@ -121,6 +120,7 @@ class NetworkFragment : BaseFragment<FragmentTasksActionSendSmsBinding?>(), View
R.id.btn_save -> { R.id.btn_save -> {
val settingVo = checkSetting() val settingVo = checkSetting()
val intent = Intent() val intent = Intent()
intent.putExtra(KEY_BACK_DESCRIPTION_CONDITION, settingVo.description)
intent.putExtra(KEY_BACK_DATA_CONDITION, Gson().toJson(settingVo)) intent.putExtra(KEY_BACK_DATA_CONDITION, Gson().toJson(settingVo))
setFragmentResult(TASK_CONDITION_NETWORK, intent) setFragmentResult(TASK_CONDITION_NETWORK, intent)
popToBack() popToBack()
@ -134,8 +134,8 @@ class NetworkFragment : BaseFragment<FragmentTasksActionSendSmsBinding?>(), View
} }
//检查设置 //检查设置
@SuppressLint("SetTextI18n") private fun checkSetting(): NetworkSetting {
private fun checkSetting(): CronSetting { val networkStateCheckId = binding!!.rgNetworkState.checkedRadioButtonId
return CronSetting(expression, description) return NetworkSetting(networkStateCheckId)
} }
} }

View File

@ -0,0 +1,141 @@
package com.idormy.sms.forwarder.fragment.condition
import android.annotation.SuppressLint
import android.content.Intent
import android.util.Log
import android.view.LayoutInflater
import android.view.View
import android.view.ViewGroup
import com.google.gson.Gson
import com.idormy.sms.forwarder.R
import com.idormy.sms.forwarder.core.BaseFragment
import com.idormy.sms.forwarder.databinding.FragmentTasksConditionSimBinding
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")
@Suppress("PrivatePropertyName")
class SimFragment : BaseFragment<FragmentTasksConditionSimBinding?>(), View.OnClickListener {
private val TAG: String = SimFragment::class.java.simpleName
var titleBar: TitleBar? = null
private var mCountDownHelper: CountDownButtonHelper? = null
@JvmField
@AutoWired(name = KEY_EVENT_DATA_CONDITION)
var eventData: String? = null
override fun initArgs() {
XRouter.getInstance().inject(this)
}
override fun viewBindingInflate(
inflater: LayoutInflater,
container: ViewGroup,
): FragmentTasksConditionSimBinding {
return FragmentTasksConditionSimBinding.inflate(inflater, container, false)
}
override fun initTitle(): TitleBar? {
titleBar = super.initTitle()!!.setImmersive(false).setTitle(R.string.task_sim)
return titleBar
}
/**
* 初始化控件
*/
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!!.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)
}
}
}
@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()
return
}
R.id.btn_save -> {
val settingVo = checkSetting()
val intent = Intent()
intent.putExtra(KEY_BACK_DESCRIPTION_CONDITION, settingVo.description)
intent.putExtra(KEY_BACK_DATA_CONDITION, Gson().toJson(settingVo))
setFragmentResult(TASK_CONDITION_SIM, intent)
popToBack()
return
}
}
} catch (e: Exception) {
XToastUtils.error(e.message.toString(), 30000)
e.printStackTrace()
}
}
//检查设置
private fun checkSetting(): SimSetting {
val simStateCheckId = binding!!.rgSimState.checkedRadioButtonId
return SimSetting(simStateCheckId)
}
}

View File

@ -19,7 +19,7 @@ import com.idormy.sms.forwarder.workers.SendWorker
import com.xuexiang.xutil.resource.ResUtils.getString import com.xuexiang.xutil.resource.ResUtils.getString
import java.util.Date import java.util.Date
@Suppress("PrivatePropertyName") @Suppress("PrivatePropertyName", "UNUSED_PARAMETER")
class SimStateReceiver : BroadcastReceiver() { class SimStateReceiver : BroadcastReceiver() {
private var TAG = "SimStateReceiver" private var TAG = "SimStateReceiver"

View File

@ -487,17 +487,20 @@ const val KEY_TEST_CONDITION = "key_test_condition"
const val KEY_EVENT_DATA_CONDITION = "event_data_condition" const val KEY_EVENT_DATA_CONDITION = "event_data_condition"
const val KEY_BACK_CODE_CONDITION = 1000 const val KEY_BACK_CODE_CONDITION = 1000
const val KEY_BACK_DATA_CONDITION = "back_data_condition" const val KEY_BACK_DATA_CONDITION = "back_data_condition"
const val KEY_BACK_DESCRIPTION_CONDITION = "back_description_condition"
const val KEY_TEST_ACTION = "key_test_action" const val KEY_TEST_ACTION = "key_test_action"
const val KEY_EVENT_DATA_ACTION = "event_data_action" const val KEY_EVENT_DATA_ACTION = "event_data_action"
const val KEY_BACK_CODE_ACTION = 2000 const val KEY_BACK_CODE_ACTION = 2000
const val KEY_BACK_DATA_ACTION = "back_data_action" const val KEY_BACK_DATA_ACTION = "back_data_action"
const val KEY_BACK_DESCRIPTION_ACTION = "back_description_action"
//注意TASK_CONDITION_XXX 枚举值 等于 TASK_CONDITION_FRAGMENT_LIST 索引加上 KEY_BACK_CODE_CONDITION不可改变 //注意TASK_CONDITION_XXX 枚举值 等于 TASK_CONDITION_FRAGMENT_LIST 索引加上 KEY_BACK_CODE_CONDITION不可改变
const val TASK_CONDITION_CRON = 1000 const val TASK_CONDITION_CRON = 1000
const val TASK_CONDITION_BATTERY = 1001 const val TASK_CONDITION_BATTERY = 1001
const val TASK_CONDITION_CHARGE = 1002 const val TASK_CONDITION_CHARGE = 1002
const val TASK_CONDITION_NETWORK = 1003 const val TASK_CONDITION_NETWORK = 1003
const val TASK_CONDITION_SIM = 1004
var TASK_CONDITION_FRAGMENT_LIST = listOf( var TASK_CONDITION_FRAGMENT_LIST = listOf(
PageInfo( PageInfo(
getString(R.string.task_cron), getString(R.string.task_cron),
@ -525,7 +528,14 @@ var TASK_CONDITION_FRAGMENT_LIST = listOf(
"com.idormy.sms.forwarder.fragment.condition.NetworkFragment", "com.idormy.sms.forwarder.fragment.condition.NetworkFragment",
"{\"\":\"\"}", "{\"\":\"\"}",
CoreAnim.slide, CoreAnim.slide,
R.drawable.auto_task_icon_wlan R.drawable.auto_task_icon_network
),
PageInfo(
getString(R.string.task_sim),
"com.idormy.sms.forwarder.fragment.condition.SimFragment",
"{\"\":\"\"}",
CoreAnim.slide,
R.drawable.auto_task_icon_sim
), ),
) )

View File

@ -0,0 +1,16 @@
package com.idormy.sms.forwarder.utils.task
import com.idormy.sms.forwarder.utils.SP_ENABLE_SERVER_AUTORUN
import com.idormy.sms.forwarder.utils.SharedPreference
/**
* 自动任务工具类 用于存储自动任务相关的配置
*/
class TaskUtils private constructor() {
companion object {
//是否启用HttpServer开机自启
var enableServerAutorun: Boolean by SharedPreference(SP_ENABLE_SERVER_AUTORUN, false)
}
}

View File

@ -1,6 +1,15 @@
<?xml version="1.0" encoding="utf-8"?> <?xml version="1.0" encoding="utf-8"?>
<vector android:height="25.0dip" android:width="25.0dip" android:autoMirrored="true" android:viewportWidth="25.0" android:viewportHeight="25.0" <vector xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:android="http://schemas.android.com/apk/res/android"> android:width="25.0dip"
<path android:fillColor="@color/auto_task_icon_grey_bg" android:pathData="M6.66,0.66L18.66,0.66A6,6 0,0 1,24.66 6.66L24.66,18.66A6,6 0,0 1,18.66 24.66L6.66,24.66A6,6 0,0 1,0.66 18.66L0.66,6.66A6,6 0,0 1,6.66 0.66z" /> android:height="25.0dip"
<path android:fillColor="@color/auto_task_icon_grey" android:pathData="M12.66,18.66C15.973,18.66 18.66,15.973 18.66,12.66C18.66,9.346 15.973,6.66 12.66,6.66C9.346,6.66 6.66,9.346 6.66,12.66C6.66,15.973 9.346,18.66 12.66,18.66ZM12.66,20.535C17.009,20.535 20.535,17.009 20.535,12.66C20.535,8.31 17.009,4.785 12.66,4.785C8.31,4.785 4.785,8.31 4.785,12.66C4.785,17.009 8.31,20.535 12.66,20.535ZM11.535,10.222C11.535,9.704 11.954,9.285 12.472,9.285C12.99,9.285 13.41,9.704 13.41,10.222V11.91H15.097C15.615,11.91 16.035,12.329 16.035,12.847C16.035,13.365 15.615,13.785 15.097,13.785H12.472C12.44,13.785 12.408,13.783 12.376,13.78C11.903,13.732 11.535,13.333 11.535,12.847V10.222Z" android:fillType="evenOdd" /> android:autoMirrored="true"
android:viewportWidth="25.0"
android:viewportHeight="25.0">
<path
android:fillColor="@color/auto_task_icon_grey_bg"
android:pathData="M6.66,0.66L18.66,0.66A6,6 0,0 1,24.66 6.66L24.66,18.66A6,6 0,0 1,18.66 24.66L6.66,24.66A6,6 0,0 1,0.66 18.66L0.66,6.66A6,6 0,0 1,6.66 0.66z" />
<path
android:fillColor="@color/auto_task_icon_grey"
android:fillType="evenOdd"
android:pathData="M12.66,18.66C15.973,18.66 18.66,15.973 18.66,12.66C18.66,9.346 15.973,6.66 12.66,6.66C9.346,6.66 6.66,9.346 6.66,12.66C6.66,15.973 9.346,18.66 12.66,18.66ZM12.66,20.535C17.009,20.535 20.535,17.009 20.535,12.66C20.535,8.31 17.009,4.785 12.66,4.785C8.31,4.785 4.785,8.31 4.785,12.66C4.785,17.009 8.31,20.535 12.66,20.535ZM11.535,10.222C11.535,9.704 11.954,9.285 12.472,9.285C12.99,9.285 13.41,9.704 13.41,10.222V11.91H15.097C15.615,11.91 16.035,12.329 16.035,12.847C16.035,13.365 15.615,13.785 15.097,13.785H12.472C12.44,13.785 12.408,13.783 12.376,13.78C11.903,13.732 11.535,13.333 11.535,12.847V10.222Z" />
</vector> </vector>

View File

@ -1,6 +1,19 @@
<?xml version="1.0" encoding="utf-8"?> <?xml version="1.0" encoding="utf-8"?>
<vector android:height="25.0dip" android:width="25.0dip" android:autoMirrored="true" android:viewportWidth="25.0" android:viewportHeight="25.0" <vector xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:android="http://schemas.android.com/apk/res/android"> android:width="25.0dip"
<path android:fillColor="@color/color_blue_primary_default" android:pathData="M6.66,0.66L18.66,0.66A6,6 0,0 1,24.66 6.66L24.66,18.66A6,6 0,0 1,18.66 24.66L6.66,24.66A6,6 0,0 1,0.66 18.66L0.66,6.66A6,6 0,0 1,6.66 0.66z" android:strokeAlpha="0.3" android:fillAlpha="0.3" /> android:height="25.0dip"
<path android:fillColor="#ffffffff" android:pathData="M12.66,18.66C15.973,18.66 18.66,15.973 18.66,12.66C18.66,9.346 15.973,6.66 12.66,6.66C9.346,6.66 6.66,9.346 6.66,12.66C6.66,15.973 9.346,18.66 12.66,18.66ZM12.66,20.535C17.009,20.535 20.535,17.009 20.535,12.66C20.535,8.31 17.009,4.785 12.66,4.785C8.31,4.785 4.785,8.31 4.785,12.66C4.785,17.009 8.31,20.535 12.66,20.535ZM11.535,10.222C11.535,9.704 11.954,9.285 12.472,9.285C12.99,9.285 13.41,9.704 13.41,10.222V11.91H15.097C15.615,11.91 16.035,12.329 16.035,12.847C16.035,13.365 15.615,13.785 15.097,13.785H12.472C12.44,13.785 12.408,13.783 12.376,13.78C11.903,13.732 11.535,13.333 11.535,12.847V10.222Z" android:strokeAlpha="0.3" android:fillAlpha="0.3" android:fillType="evenOdd" /> android:autoMirrored="true"
android:viewportWidth="25.0"
android:viewportHeight="25.0">
<path
android:fillAlpha="0.3"
android:fillColor="@color/color_blue_primary_default"
android:pathData="M6.66,0.66L18.66,0.66A6,6 0,0 1,24.66 6.66L24.66,18.66A6,6 0,0 1,18.66 24.66L6.66,24.66A6,6 0,0 1,0.66 18.66L0.66,6.66A6,6 0,0 1,6.66 0.66z"
android:strokeAlpha="0.3" />
<path
android:fillAlpha="0.3"
android:fillColor="#ffffffff"
android:fillType="evenOdd"
android:pathData="M12.66,18.66C15.973,18.66 18.66,15.973 18.66,12.66C18.66,9.346 15.973,6.66 12.66,6.66C9.346,6.66 6.66,9.346 6.66,12.66C6.66,15.973 9.346,18.66 12.66,18.66ZM12.66,20.535C17.009,20.535 20.535,17.009 20.535,12.66C20.535,8.31 17.009,4.785 12.66,4.785C8.31,4.785 4.785,8.31 4.785,12.66C4.785,17.009 8.31,20.535 12.66,20.535ZM11.535,10.222C11.535,9.704 11.954,9.285 12.472,9.285C12.99,9.285 13.41,9.704 13.41,10.222V11.91H15.097C15.615,11.91 16.035,12.329 16.035,12.847C16.035,13.365 15.615,13.785 15.097,13.785H12.472C12.44,13.785 12.408,13.783 12.376,13.78C11.903,13.732 11.535,13.333 11.535,12.847V10.222Z"
android:strokeAlpha="0.3" />
</vector> </vector>

View File

@ -0,0 +1,20 @@
<?xml version="1.0" encoding="utf-8"?>
<vector xmlns:android="http://schemas.android.com/apk/res/android"
android:width="25.0dip"
android:height="25.0dip"
android:autoMirrored="true"
android:viewportWidth="25.0"
android:viewportHeight="25.0">
<path
android:fillColor="@color/auto_task_icon_grey_bg"
android:pathData="M6.66,0.66L18.66,0.66A6,6 0,0 1,24.66 6.66L24.66,18.66A6,6 0,0 1,18.66 24.66L6.66,24.66A6,6 0,0 1,0.66 18.66L0.66,6.66A6,6 0,0 1,6.66 0.66z" />
<group
android:scaleX="0.8"
android:scaleY="0.8"
android:translateX="3.2"
android:translateY="3">
<path
android:fillColor="@color/auto_task_icon_grey"
android:pathData="M7.77,6.76L6.23,5.48 0.82,12l5.41,6.52 1.54,-1.28L3.42,12l4.35,-5.24zM7,13h2v-2L7,11v2zM17,11h-2v2h2v-2zM11,13h2v-2h-2v2zM17.77,5.48l-1.54,1.28L20.58,12l-4.35,5.24 1.54,1.28L23.18,12l-5.41,-6.52z" />
</group>
</vector>

View File

@ -0,0 +1,20 @@
<?xml version="1.0" encoding="utf-8"?>
<vector xmlns:android="http://schemas.android.com/apk/res/android"
android:width="24.0dip"
android:height="24.0dip"
android:autoMirrored="true"
android:viewportWidth="24.0"
android:viewportHeight="24.0">
<path
android:fillColor="@color/auto_task_icon_grey_bg"
android:pathData="M6,0L18,0A6,6 0,0 1,24 6L24,18A6,6 0,0 1,18 24L6,24A6,6 0,0 1,0 18L0,6A6,6 0,0 1,6 0z" />
<group
android:scaleX="0.8"
android:scaleY="0.8"
android:translateX="2.5"
android:translateY="2.5">
<path
android:fillColor="@color/auto_task_icon_grey"
android:pathData="M14,12l-2,2l-2,-2l2,-2L14,12zM12,6l2.12,2.12l2.5,-2.5L12,1L7.38,5.62l2.5,2.5L12,6zM6,12l2.12,-2.12l-2.5,-2.5L1,12l4.62,4.62l2.5,-2.5L6,12zM18,12l-2.12,2.12l2.5,2.5L23,12l-4.62,-4.62l-2.5,2.5L18,12zM12,18l-2.12,-2.12l-2.5,2.5L12,23l4.62,-4.62l-2.5,-2.5L12,18z" />
</group>
</vector>

View File

@ -0,0 +1,20 @@
<?xml version="1.0" encoding="utf-8"?>
<vector xmlns:android="http://schemas.android.com/apk/res/android"
android:width="25.0dip"
android:height="25.0dip"
android:autoMirrored="true"
android:viewportWidth="25.0"
android:viewportHeight="25.0">
<path
android:fillColor="@color/auto_task_icon_grey_bg"
android:pathData="M6.66,0.66L18.66,0.66A6,6 0,0 1,24.66 6.66L24.66,18.66A6,6 0,0 1,18.66 24.66L6.66,24.66A6,6 0,0 1,0.66 18.66L0.66,6.66A6,6 0,0 1,6.66 0.66z" />
<group
android:scaleX="0.8"
android:scaleY="0.8"
android:translateX="3.2"
android:translateY="3">
<path
android:fillColor="@color/auto_task_icon_grey"
android:pathData="M2.01,21L23,12 2.01,3 2,10l15,2 -15,2z" />
</group>
</vector>

View File

@ -8,8 +8,14 @@
<path <path
android:fillColor="@color/colorPrimaryDark" android:fillColor="@color/colorPrimaryDark"
android:pathData="M6.66,0.66L18.66,0.66A6,6 0,0 1,24.66 6.66L24.66,18.66A6,6 0,0 1,18.66 24.66L6.66,24.66A6,6 0,0 1,0.66 18.66L0.66,6.66A6,6 0,0 1,6.66 0.66z" /> android:pathData="M6.66,0.66L18.66,0.66A6,6 0,0 1,24.66 6.66L24.66,18.66A6,6 0,0 1,18.66 24.66L6.66,24.66A6,6 0,0 1,0.66 18.66L0.66,6.66A6,6 0,0 1,6.66 0.66z" />
<path <group
android:fillColor="#ffffffff" android:scaleX="0.8"
android:fillType="evenOdd" android:scaleY="0.8"
android:pathData="M19.99,4c0,-1.1 -0.89,-2 -1.99,-2h-8L4,8v12c0,1.1 0.9,2 2,2h12.01c1.1,0 1.99,-0.9 1.99,-2l-0.01,-16zM9,19L7,19v-2h2v2zM17,19h-2v-2h2v2zM9,15L7,15v-4h2v4zM13,19h-2v-4h2v4zM13,13h-2v-2h2v2zM17,15h-2v-4h2v4z" /> android:translateX="3.2"
android:translateY="3">
<path
android:fillColor="#ffffffff"
android:fillType="evenOdd"
android:pathData="M19.99,4c0,-1.1 -0.89,-2 -1.99,-2h-8L4,8v12c0,1.1 0.9,2 2,2h12.01c1.1,0 1.99,-0.9 1.99,-2l-0.01,-16zM9,19L7,19v-2h2v2zM17,19h-2v-2h2v2zM9,15L7,15v-4h2v4zM13,19h-2v-4h2v4zM13,13h-2v-2h2v2zM17,15h-2v-4h2v4z" />
</group>
</vector> </vector>

View File

@ -0,0 +1,21 @@
<?xml version="1.0" encoding="utf-8"?>
<vector xmlns:android="http://schemas.android.com/apk/res/android"
android:width="25.0dip"
android:height="25.0dip"
android:autoMirrored="true"
android:viewportWidth="25.0"
android:viewportHeight="25.0">
<path
android:fillColor="@color/auto_task_icon_grey_bg"
android:pathData="M6.66,0.66L18.66,0.66A6,6 0,0 1,24.66 6.66L24.66,18.66A6,6 0,0 1,18.66 24.66L6.66,24.66A6,6 0,0 1,0.66 18.66L0.66,6.66A6,6 0,0 1,6.66 0.66z" />
<group
android:scaleX="0.8"
android:scaleY="0.8"
android:translateX="3.2"
android:translateY="3">
<path
android:fillColor="@color/auto_task_icon_grey"
android:fillType="evenOdd"
android:pathData="M19.99,4c0,-1.1 -0.89,-2 -1.99,-2h-8L4,8v12c0,1.1 0.9,2 2,2h12.01c1.1,0 1.99,-0.9 1.99,-2l-0.01,-16zM9,19L7,19v-2h2v2zM17,19h-2v-2h2v2zM9,15L7,15v-4h2v4zM13,19h-2v-4h2v4zM13,13h-2v-2h2v2zM17,15h-2v-4h2v4z" />
</group>
</vector>

View File

@ -1,6 +1,14 @@
<?xml version="1.0" encoding="utf-8"?> <?xml version="1.0" encoding="utf-8"?>
<vector android:height="28.0dip" android:width="28.0dip" android:viewportWidth="28.0" android:viewportHeight="28.0" <vector xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:android="http://schemas.android.com/apk/res/android"> android:width="28.0dip"
<path android:fillColor="#ffffb21d" android:pathData="M7.5,0L20.5,0A7.5,7.5 0,0 1,28 7.5L28,20.5A7.5,7.5 0,0 1,20.5 28L7.5,28A7.5,7.5 0,0 1,0 20.5L0,7.5A7.5,7.5 0,0 1,7.5 0z" /> android:height="28.0dip"
<path android:fillColor="#ffffffff" android:pathData="M5,9.2C5,8.08 5,7.52 5.218,7.092C5.41,6.716 5.716,6.41 6.092,6.218C6.52,6 7.08,6 8.2,6H19.8C20.92,6 21.48,6 21.908,6.218C22.284,6.41 22.59,6.716 22.782,7.092C23,7.52 23,8.08 23,9.2V16.8C23,17.92 23,18.48 22.782,18.908C22.59,19.284 22.284,19.59 21.908,19.782C21.48,20 20.92,20 19.8,20H8.484C8.304,20 8.214,20 8.127,20.015C8.05,20.029 7.975,20.052 7.903,20.083C7.822,20.119 7.747,20.169 7.597,20.269L7.597,20.269L6.244,21.171C5.84,21.44 5.638,21.575 5.47,21.565C5.324,21.556 5.189,21.484 5.101,21.367C5,21.234 5,20.991 5,20.505V9.2ZM9,11C9,10.448 9.448,10 10,10H18C18.552,10 19,10.448 19,11C19,11.552 18.552,12 18,12H10C9.448,12 9,11.552 9,11ZM10,14C9.448,14 9,14.448 9,15C9,15.552 9.448,16 10,16H14C14.552,16 15,15.552 15,15C15,14.448 14.552,14 14,14H10Z" android:fillType="evenOdd" /> android:viewportWidth="28.0"
android:viewportHeight="28.0">
<path
android:fillColor="#ffffb21d"
android:pathData="M7.5,0L20.5,0A7.5,7.5 0,0 1,28 7.5L28,20.5A7.5,7.5 0,0 1,20.5 28L7.5,28A7.5,7.5 0,0 1,0 20.5L0,7.5A7.5,7.5 0,0 1,7.5 0z" />
<path
android:fillColor="#ffffffff"
android:fillType="evenOdd"
android:pathData="M5,9.2C5,8.08 5,7.52 5.218,7.092C5.41,6.716 5.716,6.41 6.092,6.218C6.52,6 7.08,6 8.2,6H19.8C20.92,6 21.48,6 21.908,6.218C22.284,6.41 22.59,6.716 22.782,7.092C23,7.52 23,8.08 23,9.2V16.8C23,17.92 23,18.48 22.782,18.908C22.59,19.284 22.284,19.59 21.908,19.782C21.48,20 20.92,20 19.8,20H8.484C8.304,20 8.214,20 8.127,20.015C8.05,20.029 7.975,20.052 7.903,20.083C7.822,20.119 7.747,20.169 7.597,20.269L7.597,20.269L6.244,21.171C5.84,21.44 5.638,21.575 5.47,21.565C5.324,21.556 5.189,21.484 5.101,21.367C5,21.234 5,20.991 5,20.505V9.2ZM9,11C9,10.448 9.448,10 10,10H18C18.552,10 19,10.448 19,11C19,11.552 18.552,12 18,12H10C9.448,12 9,11.552 9,11ZM10,14C9.448,14 9,14.448 9,15C9,15.552 9.448,16 10,16H14C14.552,16 15,15.552 15,15C15,14.448 14.552,14 14,14H10Z" />
</vector> </vector>

View File

@ -0,0 +1,14 @@
<?xml version="1.0" encoding="utf-8"?>
<vector xmlns:android="http://schemas.android.com/apk/res/android"
android:width="28.0dip"
android:height="28.0dip"
android:viewportWidth="28.0"
android:viewportHeight="28.0">
<path
android:fillColor="@color/auto_task_icon_grey_bg"
android:pathData="M7.5,0L20.5,0A7.5,7.5 0,0 1,28 7.5L28,20.5A7.5,7.5 0,0 1,20.5 28L7.5,28A7.5,7.5 0,0 1,0 20.5L0,7.5A7.5,7.5 0,0 1,7.5 0z" />
<path
android:fillColor="@color/auto_task_icon_grey"
android:fillType="evenOdd"
android:pathData="M5,9.2C5,8.08 5,7.52 5.218,7.092C5.41,6.716 5.716,6.41 6.092,6.218C6.52,6 7.08,6 8.2,6H19.8C20.92,6 21.48,6 21.908,6.218C22.284,6.41 22.59,6.716 22.782,7.092C23,7.52 23,8.08 23,9.2V16.8C23,17.92 23,18.48 22.782,18.908C22.59,19.284 22.284,19.59 21.908,19.782C21.48,20 20.92,20 19.8,20H8.484C8.304,20 8.214,20 8.127,20.015C8.05,20.029 7.975,20.052 7.903,20.083C7.822,20.119 7.747,20.169 7.597,20.269L7.597,20.269L6.244,21.171C5.84,21.44 5.638,21.575 5.47,21.565C5.324,21.556 5.189,21.484 5.101,21.367C5,21.234 5,20.991 5,20.505V9.2ZM9,11C9,10.448 9.448,10 10,10H18C18.552,10 19,10.448 19,11C19,11.552 18.552,12 18,12H10C9.448,12 9,11.552 9,11ZM10,14C9.448,14 9,14.448 9,15C9,15.552 9.448,16 10,16H14C14.552,16 15,15.552 15,15C15,14.448 14.552,14 14,14H10Z" />
</vector>

View File

@ -7,6 +7,7 @@
android:orientation="vertical"> android:orientation="vertical">
<TextView <TextView
android:id="@+id/tv_title"
android:layout_width="wrap_content" android:layout_width="wrap_content"
android:layout_height="wrap_content" android:layout_height="wrap_content"
android:layout_gravity="center" android:layout_gravity="center"

View File

@ -21,7 +21,7 @@
android:orientation="vertical"> android:orientation="vertical">
<LinearLayout <LinearLayout
style="@style/senderBarStyle" style="@style/taskBarStyle"
android:layout_width="match_parent" android:layout_width="match_parent"
android:layout_height="wrap_content" android:layout_height="wrap_content"
android:orientation="vertical"> android:orientation="vertical">
@ -29,7 +29,15 @@
<TextView <TextView
android:layout_width="match_parent" android:layout_width="match_parent"
android:layout_height="wrap_content" android:layout_height="wrap_content"
android:text="@string/sim_slot" /> android:text="@string/sim_slot"
android:textStyle="bold" />
<View
android:layout_width="match_parent"
android:layout_height="1dp"
android:layout_marginTop="5dp"
android:layout_marginBottom="5dp"
android:background="?attr/xui_config_color_separator_light" />
<RadioGroup <RadioGroup
android:id="@+id/rg_sim_slot" android:id="@+id/rg_sim_slot"
@ -55,7 +63,7 @@
</LinearLayout> </LinearLayout>
<LinearLayout <LinearLayout
style="@style/senderBarStyle" style="@style/taskBarStyle"
android:layout_width="match_parent" android:layout_width="match_parent"
android:layout_height="wrap_content" android:layout_height="wrap_content"
android:orientation="vertical"> android:orientation="vertical">
@ -63,7 +71,15 @@
<TextView <TextView
android:layout_width="match_parent" android:layout_width="match_parent"
android:layout_height="wrap_content" android:layout_height="wrap_content"
android:text="@string/phone_numbers" /> android:text="@string/phone_numbers"
android:textStyle="bold" />
<View
android:layout_width="match_parent"
android:layout_height="1dp"
android:layout_marginTop="5dp"
android:layout_marginBottom="5dp"
android:background="?attr/xui_config_color_separator_light" />
<com.xuexiang.xui.widget.edittext.materialedittext.MaterialEditText <com.xuexiang.xui.widget.edittext.materialedittext.MaterialEditText
android:id="@+id/et_phone_numbers" android:id="@+id/et_phone_numbers"
@ -80,7 +96,7 @@
</LinearLayout> </LinearLayout>
<LinearLayout <LinearLayout
style="@style/senderBarStyle" style="@style/taskBarStyle"
android:layout_width="match_parent" android:layout_width="match_parent"
android:layout_height="wrap_content" android:layout_height="wrap_content"
android:orientation="vertical"> android:orientation="vertical">
@ -88,7 +104,15 @@
<TextView <TextView
android:layout_width="match_parent" android:layout_width="match_parent"
android:layout_height="wrap_content" android:layout_height="wrap_content"
android:text="@string/msg_content" /> android:text="@string/msg_content"
android:textStyle="bold" />
<View
android:layout_width="match_parent"
android:layout_height="1dp"
android:layout_marginTop="5dp"
android:layout_marginBottom="5dp"
android:background="?attr/xui_config_color_separator_light" />
<com.xuexiang.xui.widget.edittext.materialedittext.MaterialEditText <com.xuexiang.xui.widget.edittext.materialedittext.MaterialEditText
android:id="@+id/et_msg_content" android:id="@+id/et_msg_content"

View File

@ -0,0 +1,176 @@
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:background="?attr/xui_config_color_background"
android:orientation="vertical">
<androidx.core.widget.NestedScrollView
android:layout_width="match_parent"
android:layout_height="0dp"
android:layout_weight="1"
android:overScrollMode="never">
<LinearLayout
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_margin="5dp"
android:orientation="vertical">
<LinearLayout
style="@style/taskBarStyle"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:orientation="vertical">
<TextView
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:text="@string/battery_level_title"
android:textStyle="bold" />
<View
android:layout_width="match_parent"
android:layout_height="1dp"
android:layout_marginTop="5dp"
android:layout_marginBottom="5dp"
android:background="?attr/xui_config_color_separator_light" />
<RadioGroup
android:id="@+id/rg_status"
style="@style/rg_style"
android:orientation="vertical"
android:paddingBottom="@dimen/config_padding_5dp">
<RadioButton
android:id="@+id/rb_battery_discharging"
style="@style/rg_rb_style_match"
android:checked="true"
android:text="@string/discharged_to"
tools:ignore="TouchTargetSizeCheck" />
<com.xuexiang.xui.widget.picker.XSeekBar
android:id="@+id/xsb_level_min"
android:layout_width="match_parent"
android:layout_height="wrap_content"
app:xsb_insideRangeLineColor="#0bd97f"
app:xsb_insideRangeLineStrokeWidth="5dp"
app:xsb_isShowBubble="true"
app:xsb_isShowRuler="true"
app:xsb_max="100"
app:xsb_min="1"
app:xsb_numberTextColor="#ffffff"
app:xsb_numberTextSize="15sp"
app:xsb_outsideRangeLineColor="#f0f0f0"
app:xsb_outsideRangeLineStrokeWidth="5dp"
app:xsb_rulerColor="@color/xui_config_color_gray_4" />
<RadioButton
android:id="@+id/rb_battery_charging"
style="@style/rg_rb_style_match"
android:text="@string/charged_to"
tools:ignore="TouchTargetSizeCheck" />
<com.xuexiang.xui.widget.picker.XSeekBar
android:id="@+id/xsb_level_max"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:visibility="gone"
app:xsb_insideRangeLineColor="#0bd97f"
app:xsb_insideRangeLineStrokeWidth="5dp"
app:xsb_isShowBubble="true"
app:xsb_isShowRuler="true"
app:xsb_max="100"
app:xsb_min="1"
app:xsb_numberTextColor="#ffffff"
app:xsb_numberTextSize="15sp"
app:xsb_outsideRangeLineColor="#f0f0f0"
app:xsb_outsideRangeLineStrokeWidth="5dp"
app:xsb_rulerColor="@color/xui_config_color_gray_4" />
</RadioGroup>
</LinearLayout>
<LinearLayout
style="@style/taskBarStyle"
android:layout_width="match_parent"
android:layout_height="wrap_content">
<LinearLayout
android:layout_width="0dp"
android:layout_height="wrap_content"
android:layout_weight="1"
android:orientation="vertical">
<TextView
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:text="@string/keep_reminding"
android:textStyle="bold"
tools:ignore="RelativeOverlap" />
<TextView
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:text="@string/keep_reminding_tips"
android:textSize="10sp"
tools:ignore="SmallSp" />
</LinearLayout>
<com.xuexiang.xui.widget.button.switchbutton.SwitchButton
android:id="@+id/sb_keep_reminding"
style="@style/SwitchButtonStyle"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
tools:ignore="TouchTargetSizeCheck" />
</LinearLayout>
</LinearLayout>
</androidx.core.widget.NestedScrollView>
<LinearLayout
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:gravity="center"
android:orientation="horizontal"
android:padding="10dp">
<com.xuexiang.xui.widget.textview.supertextview.SuperButton
android:id="@+id/btn_del"
style="@style/SuperButton.Gray.Icon"
android:drawableStart="@drawable/icon_delete"
android:paddingStart="15dp"
android:text="@string/discard"
android:textSize="11sp"
tools:ignore="RtlSymmetry,TextContrastCheck,TouchTargetSizeCheck" />
<com.xuexiang.xui.widget.textview.supertextview.SuperButton
android:id="@+id/btn_save"
style="@style/SuperButton.Blue.Icon"
android:layout_marginStart="10dp"
android:drawableStart="@drawable/icon_save"
android:paddingStart="15dp"
android:text="@string/submit"
android:textSize="11sp"
tools:ignore="RtlSymmetry,TextContrastCheck,TouchTargetSizeCheck" />
<com.xuexiang.xui.widget.textview.supertextview.SuperButton
android:id="@+id/btn_test"
style="@style/SuperButton.Green.Icon"
android:layout_marginStart="10dp"
android:drawableStart="@drawable/icon_test"
android:paddingStart="15dp"
android:text="@string/test"
android:textSize="11sp"
android:visibility="gone"
tools:ignore="RtlSymmetry" />
</LinearLayout>
</LinearLayout>

View File

@ -0,0 +1,178 @@
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:background="?attr/xui_config_color_background"
android:orientation="vertical">
<androidx.core.widget.NestedScrollView
android:layout_width="match_parent"
android:layout_height="0dp"
android:layout_weight="1"
android:overScrollMode="never">
<LinearLayout
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_margin="5dp"
android:orientation="vertical">
<LinearLayout
style="@style/taskBarStyle"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:orientation="vertical">
<TextView
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:text="@string/battery_status_title"
android:textStyle="bold" />
<View
android:layout_width="match_parent"
android:layout_height="1dp"
android:layout_marginTop="5dp"
android:layout_marginBottom="5dp"
android:background="?attr/xui_config_color_separator_light" />
<RadioGroup
android:id="@+id/rg_status"
style="@style/rg_style"
android:orientation="vertical"
android:paddingBottom="@dimen/config_padding_5dp">
<RadioButton
android:id="@+id/rb_battery_discharging"
style="@style/rg_rb_style_match"
android:checked="true"
android:text="@string/battery_charging"
tools:ignore="TouchTargetSizeCheck" />
<RadioButton
android:id="@+id/rb_battery_charging"
style="@style/rg_rb_style_match"
android:text="@string/battery_discharging"
tools:ignore="TouchTargetSizeCheck" />
<RadioButton
android:id="@+id/rb_battery_not_charging"
style="@style/rg_rb_style_match"
android:text="@string/battery_not_charging"
tools:ignore="TouchTargetSizeCheck" />
<RadioButton
android:id="@+id/rb_battery_full"
style="@style/rg_rb_style_match"
android:text="@string/battery_full"
tools:ignore="TouchTargetSizeCheck" />
<RadioButton
android:id="@+id/rb_battery_unknown"
style="@style/rg_rb_style_match"
android:text="@string/battery_unknown"
tools:ignore="TouchTargetSizeCheck,DuplicateSpeakableTextCheck" />
</RadioGroup>
</LinearLayout>
<LinearLayout
style="@style/taskBarStyle"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:orientation="vertical">
<TextView
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:text="@string/battery_plugged_title"
android:textStyle="bold" />
<View
android:layout_width="match_parent"
android:layout_height="1dp"
android:layout_marginTop="5dp"
android:layout_marginBottom="5dp"
android:background="?attr/xui_config_color_separator_light" />
<RadioGroup
android:id="@+id/rg_plugged"
style="@style/rg_style"
android:orientation="vertical"
android:paddingBottom="@dimen/config_padding_5dp">
<RadioButton
android:id="@+id/rb_plugged_ac"
style="@style/rg_rb_style_match"
android:checked="true"
android:text="@string/battery_ac"
tools:ignore="TouchTargetSizeCheck" />
<RadioButton
android:id="@+id/rb_plugged_usb"
style="@style/rg_rb_style_match"
android:text="@string/battery_usb"
tools:ignore="TouchTargetSizeCheck" />
<RadioButton
android:id="@+id/rb_plugged_wireless"
style="@style/rg_rb_style_match"
android:text="@string/battery_wireless"
tools:ignore="TouchTargetSizeCheck" />
<RadioButton
android:id="@+id/rb_plugged_unknown"
style="@style/rg_rb_style_match"
android:text="@string/battery_unknown"
tools:ignore="TouchTargetSizeCheck" />
</RadioGroup>
</LinearLayout>
</LinearLayout>
</androidx.core.widget.NestedScrollView>
<LinearLayout
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:gravity="center"
android:orientation="horizontal"
android:padding="10dp">
<com.xuexiang.xui.widget.textview.supertextview.SuperButton
android:id="@+id/btn_del"
style="@style/SuperButton.Gray.Icon"
android:drawableStart="@drawable/icon_delete"
android:paddingStart="15dp"
android:text="@string/discard"
android:textSize="11sp"
tools:ignore="RtlSymmetry,TextContrastCheck,TouchTargetSizeCheck" />
<com.xuexiang.xui.widget.textview.supertextview.SuperButton
android:id="@+id/btn_save"
style="@style/SuperButton.Blue.Icon"
android:layout_marginStart="10dp"
android:drawableStart="@drawable/icon_save"
android:paddingStart="15dp"
android:text="@string/submit"
android:textSize="11sp"
tools:ignore="RtlSymmetry,TextContrastCheck,TouchTargetSizeCheck" />
<com.xuexiang.xui.widget.textview.supertextview.SuperButton
android:id="@+id/btn_test"
style="@style/SuperButton.Green.Icon"
android:layout_marginStart="10dp"
android:drawableStart="@drawable/icon_test"
android:paddingStart="15dp"
android:text="@string/test"
android:textSize="11sp"
android:visibility="gone"
tools:ignore="RtlSymmetry" />
</LinearLayout>
</LinearLayout>

View File

@ -0,0 +1,124 @@
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:background="?attr/xui_config_color_background"
android:orientation="vertical">
<androidx.core.widget.NestedScrollView
android:layout_width="match_parent"
android:layout_height="0dp"
android:layout_weight="1"
android:overScrollMode="never">
<LinearLayout
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_margin="5dp"
android:orientation="vertical">
<LinearLayout
style="@style/taskBarStyle"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:orientation="vertical">
<TextView
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:text="@string/task_network"
android:textStyle="bold" />
<View
android:layout_width="match_parent"
android:layout_height="1dp"
android:layout_marginTop="5dp"
android:layout_marginBottom="5dp"
android:background="?attr/xui_config_color_separator_light" />
<RadioGroup
android:id="@+id/rg_network_state"
style="@style/rg_style"
android:orientation="vertical"
android:paddingBottom="@dimen/config_padding_5dp">
<RadioButton
android:id="@+id/rb_no_network"
style="@style/rg_rb_style_match"
android:checked="true"
android:text="@string/no_network"
tools:ignore="TouchTargetSizeCheck" />
<RadioButton
android:id="@+id/rb_net_mobile"
style="@style/rg_rb_style_match"
android:text="@string/net_mobile"
tools:ignore="TouchTargetSizeCheck" />
<RadioButton
android:id="@+id/rb_net_wifi"
style="@style/rg_rb_style_match"
android:text="@string/net_wifi"
tools:ignore="TouchTargetSizeCheck" />
<RadioButton
android:id="@+id/rb_net_ethernet"
style="@style/rg_rb_style_match"
android:text="@string/net_ethernet"
tools:ignore="TouchTargetSizeCheck" />
<RadioButton
android:id="@+id/rb_net_unknown"
style="@style/rg_rb_style_match"
android:text="@string/net_unknown"
tools:ignore="TouchTargetSizeCheck,DuplicateSpeakableTextCheck" />
</RadioGroup>
</LinearLayout>
</LinearLayout>
</androidx.core.widget.NestedScrollView>
<LinearLayout
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:gravity="center"
android:orientation="horizontal"
android:padding="10dp">
<com.xuexiang.xui.widget.textview.supertextview.SuperButton
android:id="@+id/btn_del"
style="@style/SuperButton.Gray.Icon"
android:drawableStart="@drawable/icon_delete"
android:paddingStart="15dp"
android:text="@string/discard"
android:textSize="11sp"
tools:ignore="RtlSymmetry,TextContrastCheck,TouchTargetSizeCheck" />
<com.xuexiang.xui.widget.textview.supertextview.SuperButton
android:id="@+id/btn_save"
style="@style/SuperButton.Blue.Icon"
android:layout_marginStart="10dp"
android:drawableStart="@drawable/icon_save"
android:paddingStart="15dp"
android:text="@string/submit"
android:textSize="11sp"
tools:ignore="RtlSymmetry,TextContrastCheck,TouchTargetSizeCheck" />
<com.xuexiang.xui.widget.textview.supertextview.SuperButton
android:id="@+id/btn_test"
style="@style/SuperButton.Green.Icon"
android:layout_marginStart="10dp"
android:drawableStart="@drawable/icon_test"
android:paddingStart="15dp"
android:text="@string/test"
android:textSize="11sp"
android:visibility="gone"
tools:ignore="RtlSymmetry" />
</LinearLayout>
</LinearLayout>

View File

@ -0,0 +1,112 @@
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:background="?attr/xui_config_color_background"
android:orientation="vertical">
<androidx.core.widget.NestedScrollView
android:layout_width="match_parent"
android:layout_height="0dp"
android:layout_weight="1"
android:overScrollMode="never">
<LinearLayout
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_margin="5dp"
android:orientation="vertical">
<LinearLayout
style="@style/taskBarStyle"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:orientation="vertical">
<TextView
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:text="@string/task_sim"
android:textStyle="bold" />
<View
android:layout_width="match_parent"
android:layout_height="1dp"
android:layout_marginTop="5dp"
android:layout_marginBottom="5dp"
android:background="?attr/xui_config_color_separator_light" />
<RadioGroup
android:id="@+id/rg_sim_state"
style="@style/rg_style"
android:orientation="vertical"
android:paddingBottom="@dimen/config_padding_5dp">
<RadioButton
android:id="@+id/rb_sim_state_absent"
style="@style/rg_rb_style_match"
android:checked="true"
android:text="@string/sim_state_absent"
tools:ignore="TouchTargetSizeCheck" />
<RadioButton
android:id="@+id/rb_sim_state_ready"
style="@style/rg_rb_style_match"
android:text="@string/sim_state_ready"
tools:ignore="TouchTargetSizeCheck" />
<RadioButton
android:id="@+id/rb_sim_state_unknown"
style="@style/rg_rb_style_match"
android:text="@string/sim_state_unknown"
tools:ignore="TouchTargetSizeCheck,DuplicateSpeakableTextCheck" />
</RadioGroup>
</LinearLayout>
</LinearLayout>
</androidx.core.widget.NestedScrollView>
<LinearLayout
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:gravity="center"
android:orientation="horizontal"
android:padding="10dp">
<com.xuexiang.xui.widget.textview.supertextview.SuperButton
android:id="@+id/btn_del"
style="@style/SuperButton.Gray.Icon"
android:drawableStart="@drawable/icon_delete"
android:paddingStart="15dp"
android:text="@string/discard"
android:textSize="11sp"
tools:ignore="RtlSymmetry,TextContrastCheck,TouchTargetSizeCheck" />
<com.xuexiang.xui.widget.textview.supertextview.SuperButton
android:id="@+id/btn_save"
style="@style/SuperButton.Blue.Icon"
android:layout_marginStart="10dp"
android:drawableStart="@drawable/icon_save"
android:paddingStart="15dp"
android:text="@string/submit"
android:textSize="11sp"
tools:ignore="RtlSymmetry,TextContrastCheck,TouchTargetSizeCheck" />
<com.xuexiang.xui.widget.textview.supertextview.SuperButton
android:id="@+id/btn_test"
style="@style/SuperButton.Green.Icon"
android:layout_marginStart="10dp"
android:drawableStart="@drawable/icon_test"
android:paddingStart="15dp"
android:text="@string/test"
android:textSize="11sp"
android:visibility="gone"
tools:ignore="RtlSymmetry" />
</LinearLayout>
</LinearLayout>

View File

@ -581,7 +581,8 @@
<string name="test_sender_sms">[%s] Congratulations, the sending channel test is successful, please continue to add forwarding rules!</string> <string name="test_sender_sms">[%s] Congratulations, the sending channel test is successful, please continue to add forwarding rules!</string>
<string name="test_sender_name">Test Channel</string> <string name="test_sender_name">Test Channel</string>
<string name="test_sim_info" tools:ignore="Typos">SIM1_TestOperator_18888888888</string> <string name="test_sim_info" tools:ignore="Typos">SIM1_TestOperator_18888888888</string>
<string name="keep_reminding">Continued</string> <string name="keep_reminding">Keep Reminding</string>
<string name="keep_reminding_tips">After exceeding the preset value, each change in battery level continues to trigger.</string>
<string name="resend">Resend</string> <string name="resend">Resend</string>
<string name="rematch">Rematch</string> <string name="rematch">Rematch</string>
<string name="from">From: </string> <string name="from">From: </string>
@ -929,12 +930,15 @@
<string name="battery_unspecified_failure">Unspecified Failure</string> <string name="battery_unspecified_failure">Unspecified Failure</string>
<string name="battery_cold">Cold</string> <string name="battery_cold">Cold</string>
<string name="battery_level">Level: %s</string> <string name="battery_level">Level: %s</string>
<string name="battery_level_title">Level</string>
<string name="battery_scale">Scale: %s</string> <string name="battery_scale">Scale: %s</string>
<string name="battery_voltage">Voltage: %s</string> <string name="battery_voltage">Voltage: %s</string>
<string name="battery_temperature">Temperature: %s</string> <string name="battery_temperature">Temperature: %s</string>
<string name="battery_status">Status: %s</string> <string name="battery_status">Status: %s</string>
<string name="battery_status_title">Status</string>
<string name="battery_health">Health: %s</string> <string name="battery_health">Health: %s</string>
<string name="battery_plugged">Plugged: %s</string> <string name="battery_plugged">Plugged: %s</string>
<string name="battery_plugged_title">Plugged</string>
<string name="server_history">History</string> <string name="server_history">History</string>
<string name="server_test">Login</string> <string name="server_test">Login</string>
@ -1073,9 +1077,11 @@
<string name="net_3g">3G Net</string> <string name="net_3g">3G Net</string>
<string name="net_4g">4G Net</string> <string name="net_4g">4G Net</string>
<string name="net_5g">5G Net</string> <string name="net_5g">5G Net</string>
<string name="net_mobile">Mobile</string>
<string name="net_wifi">WiFi</string> <string name="net_wifi">WiFi</string>
<string name="net_ethernet">Ethernet</string> <string name="net_ethernet">Ethernet</string>
<string name="net_unknown">Unknown</string> <string name="net_unknown">Unknown</string>
<string name="network_state">Network State: %s</string>
<string name="wifi_ssid">WiFi SSID</string> <string name="wifi_ssid">WiFi SSID</string>
<string name="enable_location_tag">Enable {{LOCATION}} Tag</string> <string name="enable_location_tag">Enable {{LOCATION}} Tag</string>
@ -1104,12 +1110,14 @@
<string name="add_action_tips">例如:禁用所有转发通道</string> <string name="add_action_tips">例如:禁用所有转发通道</string>
<string name="add_action_continue">继续添加动作</string> <string name="add_action_continue">继续添加动作</string>
<string name="select_task_condition">Please select condition</string> <string name="select_task_trigger">Please select trigger condition</string>
<string name="select_task_condition">Please select additional condition</string>
<string name="select_task_action">Please select action</string> <string name="select_task_action">Please select action</string>
<string name="task_cron">Cron</string> <string name="task_cron">Cron</string>
<string name="task_charge">Charge</string> <string name="task_charge">Charge</string>
<string name="task_battery">Battery</string> <string name="task_battery">Battery</string>
<string name="task_network">Network</string> <string name="task_network">Network</string>
<string name="task_sim">SIM Status</string>
<string name="task_sendsms">Send Sms</string> <string name="task_sendsms">Send Sms</string>
<string name="task_notification">Notification</string> <string name="task_notification">Notification</string>
<string name="task_frpc">Frpc Setting</string> <string name="task_frpc">Frpc Setting</string>
@ -1162,8 +1170,8 @@
<string name="recent_day_2">day of each month.</string> <string name="recent_day_2">day of each month.</string>
<string name="last_day_of_month">Last day of month</string> <string name="last_day_of_month">Last day of month</string>
<string name="last_day_of_month_recent_day">Last day of month recent days</string> <string name="last_day_of_month_recent_day">Last day of month recent days</string>
<string name="weeks_of_week_1"></string> <string name="weeks_of_week_1">The</string>
<string name="weeks_of_week_2">周的星期</string> <string name="weeks_of_week_2">th week\'s day</string>
<string name="last_week_of_month">The last [day of the week] of this month.</string> <string name="last_week_of_month">The last [day of the week] of this month.</string>
<string name="last_week_of_month_1">The last week</string> <string name="last_week_of_month_1">The last week</string>
<string name="last_week_of_month_2">of this month.</string> <string name="last_week_of_month_2">of this month.</string>
@ -1172,4 +1180,15 @@
<string name="next_execution_times">The next %s execution times:\n%s</string> <string name="next_execution_times">The next %s execution times:\n%s</string>
<string name="send_sms_to">Use SIM-%s to send sms\n%s</string> <string name="send_sms_to">Use SIM-%s to send sms\n%s</string>
<string name="discharged_to">Discharged to the specified battery level</string>
<string name="charged_to">Charged to the specified battery level</string>
<string name="battery_discharged_to">The battery discharged to %s%%</string>
<string name="battery_discharged_below">"The battery discharged below %s%%</string>
<string name="battery_charged_to">The battery charged to %s%%</string>
<string name="battery_charged_above">The battery charged above %s%%</string>
<string name="sim_state">SIM State%s</string>
<string name="sim_state_absent">Absent</string>
<string name="sim_state_ready">Ready</string>
<string name="sim_state_unknown">Unknown</string>
</resources> </resources>

View File

@ -443,7 +443,7 @@
<string name="invalid_server_ip">请输入服务端IP</string> <string name="invalid_server_ip">请输入服务端IP</string>
<string name="on_wireless_network">当前处于无线网络</string> <string name="on_wireless_network">当前处于无线网络</string>
<string name="on_mobile_network">当前处于移动网络</string> <string name="on_mobile_network">当前处于移动网络</string>
<string name="no_network">当前没有网络</string> <string name="no_network">没有网络</string>
<string name="not_connected_wifi">未连接Wifi</string> <string name="not_connected_wifi">未连接Wifi</string>
<string name="failed_to_get_ip">获取IP失败</string> <string name="failed_to_get_ip">获取IP失败</string>
<string name="sms">短 信</string> <string name="sms">短 信</string>
@ -583,6 +583,7 @@
<string name="test_sender_name">测试通道</string> <string name="test_sender_name">测试通道</string>
<string name="test_sim_info" tools:ignore="Typos">SIM1_测试运营商_18888888888</string> <string name="test_sim_info" tools:ignore="Typos">SIM1_测试运营商_18888888888</string>
<string name="keep_reminding">持续提醒</string> <string name="keep_reminding">持续提醒</string>
<string name="keep_reminding_tips">超过预设值之后,每次电量变化继续触发</string>
<string name="resend">重发消息</string> <string name="resend">重发消息</string>
<string name="rematch">重新匹配规则</string> <string name="rematch">重新匹配规则</string>
<string name="from">来源:</string> <string name="from">来源:</string>
@ -930,12 +931,15 @@
<string name="battery_unspecified_failure">未知错误</string> <string name="battery_unspecified_failure">未知错误</string>
<string name="battery_cold">温度过低</string> <string name="battery_cold">温度过低</string>
<string name="battery_level">剩余电量:%s</string> <string name="battery_level">剩余电量:%s</string>
<string name="battery_level_title">剩余电量</string>
<string name="battery_scale">充满电量:%s</string> <string name="battery_scale">充满电量:%s</string>
<string name="battery_voltage">当前电压:%s</string> <string name="battery_voltage">当前电压:%s</string>
<string name="battery_temperature">当前温度:%s</string> <string name="battery_temperature">当前温度:%s</string>
<string name="battery_status">电池状态:%s</string> <string name="battery_status">电池状态:%s</string>
<string name="battery_status_title">电池状态</string>
<string name="battery_health">健康度:%s</string> <string name="battery_health">健康度:%s</string>
<string name="battery_plugged">充电器:%s</string> <string name="battery_plugged">充电器:%s</string>
<string name="battery_plugged_title">充电器</string>
<string name="server_history">历史记录</string> <string name="server_history">历史记录</string>
<string name="server_test">登录服务</string> <string name="server_test">登录服务</string>
@ -1074,9 +1078,11 @@
<string name="net_3g">3G网络</string> <string name="net_3g">3G网络</string>
<string name="net_4g">4G网络</string> <string name="net_4g">4G网络</string>
<string name="net_5g">5G网络</string> <string name="net_5g">5G网络</string>
<string name="net_mobile">移动网络</string>
<string name="net_wifi">WiFi</string> <string name="net_wifi">WiFi</string>
<string name="net_ethernet">有线网络</string> <string name="net_ethernet">有线网络</string>
<string name="net_unknown">未知网络</string> <string name="net_unknown">未知网络</string>
<string name="network_state">网络状态:%s</string>
<string name="wifi_ssid">WiFi名称</string> <string name="wifi_ssid">WiFi名称</string>
<string name="enable_location_tag">启用 {{定位信息}} 标签</string> <string name="enable_location_tag">启用 {{定位信息}} 标签</string>
@ -1105,12 +1111,14 @@
<string name="add_action_tips">例如:禁用所有转发通道</string> <string name="add_action_tips">例如:禁用所有转发通道</string>
<string name="add_action_continue">继续添加动作</string> <string name="add_action_continue">继续添加动作</string>
<string name="select_task_condition">请选择条件</string> <string name="select_task_trigger">请选择触发条件</string>
<string name="select_task_condition">请选择附加条件</string>
<string name="select_task_action">请选择动作</string> <string name="select_task_action">请选择动作</string>
<string name="task_cron">定时任务</string> <string name="task_cron">定时任务</string>
<string name="task_charge">充电状态</string> <string name="task_charge">充电状态</string>
<string name="task_battery">电量使用</string> <string name="task_battery">电量使用</string>
<string name="task_network">网络状态</string> <string name="task_network">网络状态</string>
<string name="task_sim">SIM卡状态</string>
<string name="task_sendsms">发送短信</string> <string name="task_sendsms">发送短信</string>
<string name="task_notification">通道推送</string> <string name="task_notification">通道推送</string>
<string name="task_frpc">设置 Frpc</string> <string name="task_frpc">设置 Frpc</string>
@ -1173,4 +1181,15 @@
<string name="next_execution_times">最近 %s 次运行时间:\n%s</string> <string name="next_execution_times">最近 %s 次运行时间:\n%s</string>
<string name="send_sms_to">通过卡槽 SIM-%s 发送短信到:\n%s</string> <string name="send_sms_to">通过卡槽 SIM-%s 发送短信到:\n%s</string>
<string name="discharged_to">放电到指定电量</string>
<string name="charged_to">充电到指定电量</string>
<string name="battery_discharged_to">电池放电低到%s%%</string>
<string name="battery_discharged_below">电池放电低于%s%%</string>
<string name="battery_charged_to">电池充电达到%s%%</string>
<string name="battery_charged_above">电池充电高于%s%%</string>
<string name="sim_state">SIM卡状态%s</string>
<string name="sim_state_absent">被移除</string>
<string name="sim_state_ready">已就绪</string>
<string name="sim_state_unknown">未知</string>
</resources> </resources>

View File

@ -229,7 +229,7 @@
<item name="android:layout_width">match_parent</item> <item name="android:layout_width">match_parent</item>
<item name="android:layout_height">wrap_content</item> <item name="android:layout_height">wrap_content</item>
<item name="android:singleLine">true</item> <item name="android:singleLine">true</item>
<item name="android:textSize">12sp</item> <!--<item name="android:textSize">12sp</item>-->
<item name="android:button">@drawable/custom_radio_button</item> <item name="android:button">@drawable/custom_radio_button</item>
</style> </style>