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

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"
android:installLocation="internalOnly">
<uses-feature
android:name="android.hardware.telephony"
android:required="false" />
<uses-permission
android:name="android.permission.QUERY_ALL_PACKAGES"
tools:ignore="QueryAllPackagesPermission" />
@ -239,6 +243,11 @@
<action android:name="android.service.notification.NotificationListenerService" />
</intent-filter>
</service>
<service
android:name=".workers.CronWorker"
android:exported="false"
android:permission="android.permission.BIND_JOB_SERVICE" />
<receiver
android:name=".receiver.BootReceiver"

View File

@ -41,7 +41,11 @@ class TaskPagingAdapter(private val itemClickListener: OnItemClickListener) : Pa
for (condition in conditionList) {
val layoutConditionItem = View.inflate(App.context, R.layout.item_setting, null) as LinearLayout
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)
}
}
@ -50,12 +54,14 @@ class TaskPagingAdapter(private val itemClickListener: OnItemClickListener) : Pa
holder.binding.layoutActionsIcons.removeAllViews()
if (item.actions.isNotEmpty()) {
val actionList = Gson().fromJson(item.actions, Array<TaskSetting>::class.java).toMutableList()
//Log.d("TaskPagingAdapter", "actionList:$actionList")
for (action in actionList) {
//Log.d("TaskPagingAdapter", "action:$action")
val layoutActionItem = View.inflate(App.context, R.layout.item_setting, null) as LinearLayout
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)
}
}
@ -69,7 +75,11 @@ class TaskPagingAdapter(private val itemClickListener: OnItemClickListener) : Pa
} else {
holder.binding.layoutImage.visibility = View.VISIBLE
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.ivEdit.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_CRON
import com.idormy.sms.forwarder.utils.TASK_CONDITION_NETWORK
import com.idormy.sms.forwarder.utils.TASK_CONDITION_SIM
import kotlinx.parcelize.Parcelize
import java.util.Date
@ -36,7 +37,8 @@ data class Task(
TASK_CONDITION_CRON -> R.drawable.auto_task_icon_custom_time
TASK_CONDITION_BATTERY -> R.drawable.auto_task_icon_battery
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_NOTIFICATION -> R.drawable.auto_task_icon_sender
TASK_ACTION_FRPC -> R.drawable.auto_task_icon_frpc
@ -44,6 +46,20 @@ data class Task(
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
get() = when (status) {
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
data class CronSetting(
var expression: String,
var description: String = "",
var description: String = "", //描述
var expression: String = "", //表达式
) : 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
data class SmsSetting(
var description: String = "",
var simSlot: Int = 1,
var phoneNumbers: String = "",
var msgContent: String = "",
var description: String = "", //描述
var simSlot: Int = 1, //卡槽
var phoneNumbers: String = "", //手机号码
var msgContent: String = "", //短信内容
) : Serializable

View File

@ -13,10 +13,10 @@ import java.io.Serializable
data class TaskSetting(
val type: Int, // TASK_CONDITION_FRAGMENT_LIST 索引加上 KEY_BACK_CODE_CONDITION 或者 TASK_ACTION_FRAGMENT_LIST 索引加上 KEY_BACK_CODE_ACTION
val title: String,
val description: String,
var setting: String = "",
var position: Int = -1
val title: String, //标题
val description: String, //描述
var setting: String = "", //设置
var position: Int = -1 //位置
) : Serializable {
val iconId: Int
@ -24,11 +24,24 @@ data class TaskSetting(
TASK_CONDITION_CRON -> R.drawable.auto_task_icon_custom_time
TASK_CONDITION_BATTERY -> R.drawable.auto_task_icon_battery
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_NOTIFICATION -> R.drawable.auto_task_icon_sender
TASK_ACTION_FRPC -> R.drawable.auto_task_icon_frpc
TASK_ACTION_HTTPSERVER -> R.drawable.auto_task_icon_http_server
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) {
R.id.layout_add_condition -> {
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))
val widgetItemAdapter = WidgetItemAdapter(TASK_CONDITION_FRAGMENT_LIST)
widgetItemAdapter.setOnItemClickListener(that)
@ -347,10 +349,6 @@ class TasksEditFragment : BaseFragment<FragmentTasksEditBinding?>(), View.OnClic
try {
dialog.dismiss()
Log.d(TAG, "onItemClick: $widgetInfo")
if (pos > 0) {
XToastUtils.info("暂不支持,敬请期待……")
return
}
//判断点击的是条件还是动作
if (widgetInfo.classPath.contains(".condition.")) {
//判断是否已经添加过该类型条件
@ -385,54 +383,18 @@ class TasksEditFragment : BaseFragment<FragmentTasksEditBinding?>(), View.OnClic
super.onFragmentResult(requestCode, resultCode, data)
Log.d(TAG, "requestCode:$requestCode resultCode:$resultCode data:$data")
if (data != null) {
val extras = data.extras
val extras = data.extras ?: return
val description: String?
var setting: String? = null
if (resultCode in KEY_BACK_CODE_CONDITION..KEY_BACK_CODE_CONDITION + 999) {
setting = extras!!.getString(KEY_BACK_DATA_CONDITION)
if (setting == null) return
setting = extras.getString(KEY_BACK_DATA_CONDITION) ?: return
//注意TASK_CONDITION_XXX 枚举值 等于 TASK_CONDITION_FRAGMENT_LIST 索引加上 KEY_BACK_CODE_CONDITION不可改变
val widgetInfoIndex = resultCode - KEY_BACK_CODE_CONDITION
if (widgetInfoIndex >= TASK_CONDITION_FRAGMENT_LIST.size) return
val widgetInfo = TASK_CONDITION_FRAGMENT_LIST[widgetInfoIndex]
val taskSetting: TaskSetting
when (resultCode) {
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
}
}
description = extras.getString(KEY_BACK_DESCRIPTION_CONDITION) ?: widgetInfo.name.toString()
val taskSetting = TaskSetting(resultCode, widgetInfo.name, description, setting, requestCode)
//requestCode: 等于 itemListConditions 的索引加1
if (requestCode == 0) {
taskSetting.position = itemListConditions.size
@ -443,51 +405,13 @@ class TasksEditFragment : BaseFragment<FragmentTasksEditBinding?>(), View.OnClic
conditionsAdapter.notifyDataSetChanged()
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) {
setting = extras!!.getString(KEY_BACK_DATA_ACTION)
if (setting == null) return
setting = extras.getString(KEY_BACK_DATA_ACTION) ?: return
//注意TASK_ACTION_XXX 枚举值 等于 TASK_ACTION_FRAGMENT_LIST 索引加上 KEY_BACK_CODE_ACTION不可改变
val widgetInfoIndex = resultCode - KEY_BACK_CODE_ACTION
if (widgetInfoIndex >= TASK_ACTION_FRAGMENT_LIST.size) return
val widgetInfo = TASK_ACTION_FRAGMENT_LIST[widgetInfoIndex]
val taskSetting: TaskSetting
when (resultCode) {
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
}
}
description = extras.getString(KEY_BACK_DESCRIPTION_ACTION) ?: widgetInfo.name.toString()
val taskSetting = TaskSetting(resultCode, widgetInfo.name, description, setting, requestCode)
//requestCode: 等于 itemListActions 的索引加1
if (requestCode == 0) {
taskSetting.position = itemListActions.size

View File

@ -136,6 +136,6 @@ class FrpcFragment : BaseFragment<FragmentTasksActionSendSmsBinding?>(), View.On
//检查设置
@SuppressLint("SetTextI18n")
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")
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.content.Intent
import android.os.BatteryManager
import android.util.Log
import android.view.LayoutInflater
import android.view.View
@ -9,9 +10,10 @@ 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.FragmentTasksActionSendSmsBinding
import com.idormy.sms.forwarder.entity.task.CronSetting
import com.idormy.sms.forwarder.databinding.FragmentTasksConditionBatteryBinding
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
@ -26,7 +28,7 @@ import com.xuexiang.xui.widget.actionbar.TitleBar
@Page(name = "Battery")
@Suppress("PrivatePropertyName")
class BatteryFragment : BaseFragment<FragmentTasksActionSendSmsBinding?>(), View.OnClickListener {
class BatteryFragment : BaseFragment<FragmentTasksConditionBatteryBinding?>(), View.OnClickListener {
private val TAG: String = BatteryFragment::class.java.simpleName
var titleBar: TitleBar? = null
@ -36,8 +38,7 @@ class BatteryFragment : BaseFragment<FragmentTasksActionSendSmsBinding?>(), View
@AutoWired(name = KEY_EVENT_DATA_CONDITION)
var eventData: String? = null
private var expression = "* * * * * ? *"
private var description = "测试描述"
private var description = ""
override fun initArgs() {
XRouter.getInstance().inject(this)
@ -46,8 +47,8 @@ class BatteryFragment : BaseFragment<FragmentTasksActionSendSmsBinding?>(), View
override fun viewBindingInflate(
inflater: LayoutInflater,
container: ViewGroup,
): FragmentTasksActionSendSmsBinding {
return FragmentTasksActionSendSmsBinding.inflate(inflater, container, false)
): FragmentTasksConditionBatteryBinding {
return FragmentTasksConditionBatteryBinding.inflate(inflater, container, false)
}
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")
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")
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 -> {
val settingVo = checkSetting()
val intent = Intent()
intent.putExtra(KEY_BACK_DESCRIPTION_CONDITION, description)
intent.putExtra(KEY_BACK_DATA_CONDITION, Gson().toJson(settingVo))
setFragmentResult(TASK_CONDITION_BATTERY, intent)
popToBack()
@ -135,7 +154,26 @@ class BatteryFragment : BaseFragment<FragmentTasksActionSendSmsBinding?>(), View
//检查设置
@SuppressLint("SetTextI18n")
private fun checkSetting(): CronSetting {
return CronSetting(expression, description)
private fun checkSetting(): 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())
}
} 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.idormy.sms.forwarder.R
import com.idormy.sms.forwarder.core.BaseFragment
import com.idormy.sms.forwarder.databinding.FragmentTasksActionSendSmsBinding
import com.idormy.sms.forwarder.entity.task.CronSetting
import com.idormy.sms.forwarder.databinding.FragmentTasksConditionChargeBinding
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
@ -26,7 +27,7 @@ import com.xuexiang.xui.widget.actionbar.TitleBar
@Page(name = "Charge")
@Suppress("PrivatePropertyName")
class ChargeFragment : BaseFragment<FragmentTasksActionSendSmsBinding?>(), View.OnClickListener {
class ChargeFragment : BaseFragment<FragmentTasksConditionChargeBinding?>(), View.OnClickListener {
private val TAG: String = ChargeFragment::class.java.simpleName
var titleBar: TitleBar? = null
@ -36,9 +37,6 @@ class ChargeFragment : BaseFragment<FragmentTasksActionSendSmsBinding?>(), View.
@AutoWired(name = KEY_EVENT_DATA_CONDITION)
var eventData: String? = null
private var expression = "* * * * * ? *"
private var description = "测试描述"
override fun initArgs() {
XRouter.getInstance().inject(this)
}
@ -46,8 +44,8 @@ class ChargeFragment : BaseFragment<FragmentTasksActionSendSmsBinding?>(), View.
override fun viewBindingInflate(
inflater: LayoutInflater,
container: ViewGroup,
): FragmentTasksActionSendSmsBinding {
return FragmentTasksActionSendSmsBinding.inflate(inflater, container, false)
): FragmentTasksConditionChargeBinding {
return FragmentTasksConditionChargeBinding.inflate(inflater, container, false)
}
override fun initTitle(): TitleBar? {
@ -73,8 +71,10 @@ class ChargeFragment : BaseFragment<FragmentTasksActionSendSmsBinding?>(), View.
Log.d(TAG, "initViews eventData:$eventData")
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")
binding!!.rgStatus.check(settingVo.getStatusCheckId())
binding!!.rgPlugged.check(settingVo.getPluggedCheckId())
}
}
@ -121,6 +121,7 @@ class ChargeFragment : BaseFragment<FragmentTasksActionSendSmsBinding?>(), View.
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_CHARGE, intent)
popToBack()
@ -134,8 +135,9 @@ class ChargeFragment : BaseFragment<FragmentTasksActionSendSmsBinding?>(), View.
}
//检查设置
@SuppressLint("SetTextI18n")
private fun checkSetting(): CronSetting {
return CronSetting(expression, description)
private fun checkSetting(): ChargeSetting {
val statusCheckId = binding!!.rgStatus.checkedRadioButtonId
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.entity.task.CronSetting
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_CRON
@ -201,6 +202,7 @@ class CronFragment : BaseFragment<FragmentTasksConditionCronBinding?>(), View.On
R.id.btn_save -> {
val settingVo = checkSetting()
val intent = Intent()
intent.putExtra(KEY_BACK_DESCRIPTION_CONDITION, description)
intent.putExtra(KEY_BACK_DATA_CONDITION, Gson().toJson(settingVo))
setFragmentResult(TASK_CONDITION_CRON, intent)
popToBack()
@ -1644,6 +1646,6 @@ class CronFragment : BaseFragment<FragmentTasksConditionCronBinding?>(), View.On
options.isNeedSpaceBetweenWords = locale == Locale("zh") || locale == Locale("ja") || locale == Locale("ko")
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.idormy.sms.forwarder.R
import com.idormy.sms.forwarder.core.BaseFragment
import com.idormy.sms.forwarder.databinding.FragmentTasksActionSendSmsBinding
import com.idormy.sms.forwarder.entity.task.CronSetting
import com.idormy.sms.forwarder.databinding.FragmentTasksConditionNetworkBinding
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_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_NETWORK
@ -26,7 +27,7 @@ import com.xuexiang.xui.widget.actionbar.TitleBar
@Page(name = "Network")
@Suppress("PrivatePropertyName")
class NetworkFragment : BaseFragment<FragmentTasksActionSendSmsBinding?>(), View.OnClickListener {
class NetworkFragment : BaseFragment<FragmentTasksConditionNetworkBinding?>(), View.OnClickListener {
private val TAG: String = NetworkFragment::class.java.simpleName
var titleBar: TitleBar? = null
@ -36,9 +37,6 @@ class NetworkFragment : BaseFragment<FragmentTasksActionSendSmsBinding?>(), View
@AutoWired(name = KEY_EVENT_DATA_CONDITION)
var eventData: String? = null
private var expression = "* * * * * ? *"
private var description = "测试描述"
override fun initArgs() {
XRouter.getInstance().inject(this)
}
@ -46,8 +44,8 @@ class NetworkFragment : BaseFragment<FragmentTasksActionSendSmsBinding?>(), View
override fun viewBindingInflate(
inflater: LayoutInflater,
container: ViewGroup,
): FragmentTasksActionSendSmsBinding {
return FragmentTasksActionSendSmsBinding.inflate(inflater, container, false)
): FragmentTasksConditionNetworkBinding {
return FragmentTasksConditionNetworkBinding.inflate(inflater, container, false)
}
override fun initTitle(): TitleBar? {
@ -73,8 +71,9 @@ class NetworkFragment : BaseFragment<FragmentTasksActionSendSmsBinding?>(), View
Log.d(TAG, "initViews eventData:$eventData")
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")
binding!!.rgNetworkState.check(settingVo.getNetworkStateCheckId())
}
}
@ -121,6 +120,7 @@ class NetworkFragment : BaseFragment<FragmentTasksActionSendSmsBinding?>(), View
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_NETWORK, intent)
popToBack()
@ -134,8 +134,8 @@ class NetworkFragment : BaseFragment<FragmentTasksActionSendSmsBinding?>(), View
}
//检查设置
@SuppressLint("SetTextI18n")
private fun checkSetting(): CronSetting {
return CronSetting(expression, description)
private fun checkSetting(): NetworkSetting {
val networkStateCheckId = binding!!.rgNetworkState.checkedRadioButtonId
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 java.util.Date
@Suppress("PrivatePropertyName")
@Suppress("PrivatePropertyName", "UNUSED_PARAMETER")
class SimStateReceiver : BroadcastReceiver() {
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_BACK_CODE_CONDITION = 1000
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_EVENT_DATA_ACTION = "event_data_action"
const val KEY_BACK_CODE_ACTION = 2000
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不可改变
const val TASK_CONDITION_CRON = 1000
const val TASK_CONDITION_BATTERY = 1001
const val TASK_CONDITION_CHARGE = 1002
const val TASK_CONDITION_NETWORK = 1003
const val TASK_CONDITION_SIM = 1004
var TASK_CONDITION_FRAGMENT_LIST = listOf(
PageInfo(
getString(R.string.task_cron),
@ -525,7 +528,14 @@ var TASK_CONDITION_FRAGMENT_LIST = listOf(
"com.idormy.sms.forwarder.fragment.condition.NetworkFragment",
"{\"\":\"\"}",
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"?>
<vector android:height="25.0dip" android:width="25.0dip" android:autoMirrored="true" android:viewportWidth="25.0" android:viewportHeight="25.0"
xmlns:android="http://schemas.android.com/apk/res/android">
<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: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" />
<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" />
<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>

View File

@ -1,6 +1,19 @@
<?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"
xmlns:android="http://schemas.android.com/apk/res/android">
<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" />
<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" />
<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: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>

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
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" />
<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
android:scaleX="0.8"
android:scaleY="0.8"
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>

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"?>
<vector android:height="28.0dip" android:width="28.0dip" android:viewportWidth="28.0" android:viewportHeight="28.0"
xmlns:android="http://schemas.android.com/apk/res/android">
<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: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" />
<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="#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>

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">
<TextView
android:id="@+id/tv_title"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_gravity="center"

View File

@ -21,7 +21,7 @@
android:orientation="vertical">
<LinearLayout
style="@style/senderBarStyle"
style="@style/taskBarStyle"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:orientation="vertical">
@ -29,7 +29,15 @@
<TextView
android:layout_width="match_parent"
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
android:id="@+id/rg_sim_slot"
@ -55,7 +63,7 @@
</LinearLayout>
<LinearLayout
style="@style/senderBarStyle"
style="@style/taskBarStyle"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:orientation="vertical">
@ -63,7 +71,15 @@
<TextView
android:layout_width="match_parent"
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
android:id="@+id/et_phone_numbers"
@ -80,7 +96,7 @@
</LinearLayout>
<LinearLayout
style="@style/senderBarStyle"
style="@style/taskBarStyle"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:orientation="vertical">
@ -88,7 +104,15 @@
<TextView
android:layout_width="match_parent"
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
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_name">Test Channel</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="rematch">Rematch</string>
<string name="from">From: </string>
@ -929,12 +930,15 @@
<string name="battery_unspecified_failure">Unspecified Failure</string>
<string name="battery_cold">Cold</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_voltage">Voltage: %s</string>
<string name="battery_temperature">Temperature: %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_plugged">Plugged: %s</string>
<string name="battery_plugged_title">Plugged</string>
<string name="server_history">History</string>
<string name="server_test">Login</string>
@ -1073,9 +1077,11 @@
<string name="net_3g">3G Net</string>
<string name="net_4g">4G Net</string>
<string name="net_5g">5G Net</string>
<string name="net_mobile">Mobile</string>
<string name="net_wifi">WiFi</string>
<string name="net_ethernet">Ethernet</string>
<string name="net_unknown">Unknown</string>
<string name="network_state">Network State: %s</string>
<string name="wifi_ssid">WiFi SSID</string>
<string name="enable_location_tag">Enable {{LOCATION}} Tag</string>
@ -1104,12 +1110,14 @@
<string name="add_action_tips">例如:禁用所有转发通道</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="task_cron">Cron</string>
<string name="task_charge">Charge</string>
<string name="task_battery">Battery</string>
<string name="task_network">Network</string>
<string name="task_sim">SIM Status</string>
<string name="task_sendsms">Send Sms</string>
<string name="task_notification">Notification</string>
<string name="task_frpc">Frpc Setting</string>
@ -1162,8 +1170,8 @@
<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_recent_day">Last day of month recent days</string>
<string name="weeks_of_week_1"></string>
<string name="weeks_of_week_2">周的星期</string>
<string name="weeks_of_week_1">The</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_1">The last week</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="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>

View File

@ -443,7 +443,7 @@
<string name="invalid_server_ip">请输入服务端IP</string>
<string name="on_wireless_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="failed_to_get_ip">获取IP失败</string>
<string name="sms">短 信</string>
@ -583,6 +583,7 @@
<string name="test_sender_name">测试通道</string>
<string name="test_sim_info" tools:ignore="Typos">SIM1_测试运营商_18888888888</string>
<string name="keep_reminding">持续提醒</string>
<string name="keep_reminding_tips">超过预设值之后,每次电量变化继续触发</string>
<string name="resend">重发消息</string>
<string name="rematch">重新匹配规则</string>
<string name="from">来源:</string>
@ -930,12 +931,15 @@
<string name="battery_unspecified_failure">未知错误</string>
<string name="battery_cold">温度过低</string>
<string name="battery_level">剩余电量:%s</string>
<string name="battery_level_title">剩余电量</string>
<string name="battery_scale">充满电量:%s</string>
<string name="battery_voltage">当前电压:%s</string>
<string name="battery_temperature">当前温度:%s</string>
<string name="battery_status">电池状态:%s</string>
<string name="battery_status_title">电池状态</string>
<string name="battery_health">健康度:%s</string>
<string name="battery_plugged">充电器:%s</string>
<string name="battery_plugged_title">充电器</string>
<string name="server_history">历史记录</string>
<string name="server_test">登录服务</string>
@ -1074,9 +1078,11 @@
<string name="net_3g">3G网络</string>
<string name="net_4g">4G网络</string>
<string name="net_5g">5G网络</string>
<string name="net_mobile">移动网络</string>
<string name="net_wifi">WiFi</string>
<string name="net_ethernet">有线网络</string>
<string name="net_unknown">未知网络</string>
<string name="network_state">网络状态:%s</string>
<string name="wifi_ssid">WiFi名称</string>
<string name="enable_location_tag">启用 {{定位信息}} 标签</string>
@ -1105,12 +1111,14 @@
<string name="add_action_tips">例如:禁用所有转发通道</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="task_cron">定时任务</string>
<string name="task_charge">充电状态</string>
<string name="task_battery">电量使用</string>
<string name="task_network">网络状态</string>
<string name="task_sim">SIM卡状态</string>
<string name="task_sendsms">发送短信</string>
<string name="task_notification">通道推送</string>
<string name="task_frpc">设置 Frpc</string>
@ -1173,4 +1181,15 @@
<string name="next_execution_times">最近 %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>

View File

@ -229,7 +229,7 @@
<item name="android:layout_width">match_parent</item>
<item name="android:layout_height">wrap_content</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>
</style>