mirror of
https://github.com/pppscn/SmsForwarder
synced 2025-08-02 17:07:41 +08:00
新增:自动任务·快捷指令 (开发中)
This commit is contained in:
parent
1302bf9e20
commit
41c0e1923a
@ -1,8 +1,6 @@
|
||||
package com.idormy.sms.forwarder.entity.task
|
||||
|
||||
import com.idormy.sms.forwarder.R
|
||||
import com.idormy.sms.forwarder.entity.LocationInfo
|
||||
import com.idormy.sms.forwarder.utils.task.ConditionUtils.Companion.calculateDistance
|
||||
import java.io.Serializable
|
||||
|
||||
data class LocationSetting(
|
||||
@ -23,24 +21,4 @@ data class LocationSetting(
|
||||
}
|
||||
}
|
||||
|
||||
//判断是否满足条件
|
||||
fun isMatchCondition(locationOld: LocationInfo, locationNew: LocationInfo): Boolean {
|
||||
if (calcType == "distance") {
|
||||
val distanceOld = calculateDistance(locationOld.latitude, locationOld.longitude, latitude, longitude)
|
||||
val distanceNew = calculateDistance(locationNew.latitude, locationNew.longitude, latitude, longitude)
|
||||
if (type == "to" && distanceOld > distance && distanceNew <= distance) {
|
||||
return true
|
||||
} else if (type == "leave" && distanceOld <= distance && distanceNew > distance) {
|
||||
return true
|
||||
}
|
||||
} else if (calcType == "address") {
|
||||
if (type == "to" && !locationOld.address.contains(address) && locationNew.address.contains(address)) {
|
||||
return true
|
||||
} else if (type == "leave" && locationOld.address.contains(address) && !locationNew.address.contains(address)) {
|
||||
return true
|
||||
}
|
||||
}
|
||||
return false
|
||||
}
|
||||
|
||||
}
|
||||
|
@ -164,7 +164,7 @@ class SettingsFragment : BaseFragment<FragmentSettingsBinding?>(), View.OnClickL
|
||||
switchDirectlyToTask(binding!!.sbDirectlyToTask)
|
||||
|
||||
//启用 {{定位信息}} 标签
|
||||
switchEnableLocation(binding!!.sbEnableLocation, binding!!.rgAccuracy, binding!!.rgPowerRequirement, binding!!.xsbMinInterval, binding!!.xsbMinDistance)
|
||||
switchEnableLocation(binding!!.sbEnableLocation, binding!!.layoutLocationSetting, binding!!.rgAccuracy, binding!!.rgPowerRequirement, binding!!.xsbMinInterval, binding!!.xsbMinDistance)
|
||||
}
|
||||
|
||||
override fun onResume() {
|
||||
@ -888,9 +888,10 @@ class SettingsFragment : BaseFragment<FragmentSettingsBinding?>(), View.OnClickL
|
||||
}
|
||||
|
||||
//启用定位功能
|
||||
private fun switchEnableLocation(@SuppressLint("UseSwitchCompatOrMaterialCode") switchEnableLocation: SwitchButton, rgAccuracy: RadioGroup, rgPowerRequirement: RadioGroup, xsbMinInterval: XSeekBar, xsbMinDistance: XSeekBar) {
|
||||
private fun switchEnableLocation(@SuppressLint("UseSwitchCompatOrMaterialCode") switchEnableLocation: SwitchButton, layoutLocationSetting: LinearLayout, rgAccuracy: RadioGroup, rgPowerRequirement: RadioGroup, xsbMinInterval: XSeekBar, xsbMinDistance: XSeekBar) {
|
||||
//是否启用定位功能
|
||||
switchEnableLocation.isChecked = SettingUtils.enableLocation
|
||||
layoutLocationSetting.visibility = if (SettingUtils.enableLocation) View.VISIBLE else View.GONE
|
||||
switchEnableLocation.setOnCheckedChangeListener { _: CompoundButton?, isChecked: Boolean ->
|
||||
SettingUtils.enableLocation = isChecked
|
||||
if (isChecked) {
|
||||
@ -915,6 +916,7 @@ class SettingsFragment : BaseFragment<FragmentSettingsBinding?>(), View.OnClickL
|
||||
} else {
|
||||
restartLocationService()
|
||||
}
|
||||
layoutLocationSetting.visibility = if (isChecked) View.VISIBLE else View.GONE
|
||||
}
|
||||
//设置位置精度:高精度(默认)
|
||||
rgAccuracy.check(
|
||||
|
@ -9,6 +9,7 @@ import androidx.work.WorkManager
|
||||
import androidx.work.workDataOf
|
||||
import com.idormy.sms.forwarder.utils.TASK_CONDITION_LOCK_SCREEN
|
||||
import com.idormy.sms.forwarder.utils.TaskWorker
|
||||
import com.idormy.sms.forwarder.utils.task.TaskUtils
|
||||
import com.idormy.sms.forwarder.workers.LockScreenWorker
|
||||
|
||||
@Suppress("PropertyName")
|
||||
@ -21,6 +22,7 @@ class LockScreenReceiver : BroadcastReceiver() {
|
||||
if (context == null || (intent?.action != Intent.ACTION_SCREEN_OFF && intent?.action != Intent.ACTION_SCREEN_ON)) return
|
||||
|
||||
Log.d(TAG, "onReceive: ${intent.action}")
|
||||
TaskUtils.lockScreenAction = intent.action.toString()
|
||||
val request = OneTimeWorkRequestBuilder<LockScreenWorker>().setInputData(
|
||||
workDataOf(
|
||||
TaskWorker.conditionType to TASK_CONDITION_LOCK_SCREEN,
|
||||
|
@ -9,6 +9,7 @@ import androidx.work.OneTimeWorkRequestBuilder
|
||||
import androidx.work.WorkManager
|
||||
import androidx.work.workDataOf
|
||||
import com.idormy.sms.forwarder.R
|
||||
import com.idormy.sms.forwarder.utils.DELAY_TIME_AFTER_SIM_READY
|
||||
import com.idormy.sms.forwarder.utils.SettingUtils
|
||||
import com.idormy.sms.forwarder.utils.TASK_CONDITION_SIM
|
||||
import com.idormy.sms.forwarder.utils.TaskWorker
|
||||
@ -50,7 +51,7 @@ class SimStateReceiver : BroadcastReceiver() {
|
||||
TelephonyManager.SIM_STATE_READY -> {
|
||||
Log.d(TAG, "SIM 卡已准备就绪")
|
||||
TaskUtils.simState = simStateNew
|
||||
duration = 5000L
|
||||
duration = DELAY_TIME_AFTER_SIM_READY
|
||||
getString(R.string.sim_state_ready)
|
||||
}
|
||||
|
||||
|
@ -89,7 +89,7 @@ class LocationService : Service(), Server.ServerListener {
|
||||
try {
|
||||
//清空缓存
|
||||
HttpServerUtils.apiLocationCache = LocationInfo()
|
||||
TaskUtils.lastLocationInfo = LocationInfo()
|
||||
TaskUtils.locationInfoOld = LocationInfo()
|
||||
|
||||
if (SettingUtils.enableLocation && PermissionUtils.isGranted(android.Manifest.permission.ACCESS_COARSE_LOCATION, android.Manifest.permission.ACCESS_FINE_LOCATION)) {
|
||||
//可根据具体需求设置定位配置参数(这里只列出一些主要的参数)
|
||||
@ -121,18 +121,20 @@ class LocationService : Service(), Server.ServerListener {
|
||||
|
||||
Log.d(TAG, "locationInfoNew = $locationInfoNew")
|
||||
HttpServerUtils.apiLocationCache = locationInfoNew
|
||||
TaskUtils.locationInfoNew = locationInfoNew
|
||||
|
||||
//TODO: 触发自动任务
|
||||
val locationInfoOld = TaskUtils.lastLocationInfo
|
||||
val locationInfoOld = TaskUtils.locationInfoOld
|
||||
if (locationInfoOld.longitude != locationInfoNew.longitude || locationInfoOld.latitude != locationInfoNew.latitude || locationInfoOld.address != locationInfoNew.address) {
|
||||
Log.d(TAG, "locationInfoOld = $locationInfoOld")
|
||||
TaskUtils.lastLocationInfo = locationInfoNew
|
||||
|
||||
val gson = Gson()
|
||||
val locationJsonOld = gson.toJson(locationInfoOld)
|
||||
val locationJsonNew = gson.toJson(locationInfoNew)
|
||||
enqueueLocationWorkerRequest(TASK_CONDITION_TO_ADDRESS, locationJsonOld, locationJsonNew)
|
||||
enqueueLocationWorkerRequest(TASK_CONDITION_LEAVE_ADDRESS, locationJsonOld, locationJsonNew)
|
||||
|
||||
TaskUtils.locationInfoOld = locationInfoNew
|
||||
}
|
||||
}
|
||||
|
||||
@ -178,7 +180,7 @@ class LocationService : Service(), Server.ServerListener {
|
||||
private fun stopService() {
|
||||
//清空缓存
|
||||
HttpServerUtils.apiLocationCache = LocationInfo()
|
||||
TaskUtils.lastLocationInfo = LocationInfo()
|
||||
TaskUtils.locationInfoOld = LocationInfo()
|
||||
|
||||
isRunning = try {
|
||||
//如果已经开始定位,则先停止定位
|
||||
|
@ -616,4 +616,10 @@ const val SP_DATA_SIM_SLOT = "data_sim_slot"
|
||||
const val SP_WIFI_SSID = "wifi_ssid"
|
||||
const val SP_IPV4 = "ipv4"
|
||||
const val SP_IPV6 = "ipv6"
|
||||
const val SP_SIM_STATE = "sim_state"
|
||||
const val SP_SIM_STATE = "sim_state"
|
||||
const val SP_LOCATION_INFO_OLD = "location_info_old"
|
||||
const val SP_LOCATION_INFO_NEW = "location_info_new"
|
||||
const val SP_LOCK_SCREEN_ACTION = "lock_screen_action"
|
||||
|
||||
//SIM卡已准备就绪时,延迟5秒(给够搜索信号时间)才执行任务
|
||||
const val DELAY_TIME_AFTER_SIM_READY = 5000L
|
@ -1,5 +1,27 @@
|
||||
package com.idormy.sms.forwarder.utils.task
|
||||
|
||||
import android.os.BatteryManager
|
||||
import android.util.Log
|
||||
import com.google.gson.Gson
|
||||
import com.idormy.sms.forwarder.entity.task.BatterySetting
|
||||
import com.idormy.sms.forwarder.entity.task.ChargeSetting
|
||||
import com.idormy.sms.forwarder.entity.task.CronSetting
|
||||
import com.idormy.sms.forwarder.entity.task.LocationSetting
|
||||
import com.idormy.sms.forwarder.entity.task.LockScreenSetting
|
||||
import com.idormy.sms.forwarder.entity.task.NetworkSetting
|
||||
import com.idormy.sms.forwarder.entity.task.SimSetting
|
||||
import com.idormy.sms.forwarder.entity.task.TaskSetting
|
||||
import com.idormy.sms.forwarder.utils.DELAY_TIME_AFTER_SIM_READY
|
||||
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_LEAVE_ADDRESS
|
||||
import com.idormy.sms.forwarder.utils.TASK_CONDITION_LOCK_SCREEN
|
||||
import com.idormy.sms.forwarder.utils.TASK_CONDITION_NETWORK
|
||||
import com.idormy.sms.forwarder.utils.TASK_CONDITION_SIM
|
||||
import com.idormy.sms.forwarder.utils.TASK_CONDITION_TO_ADDRESS
|
||||
import gatewayapps.crondroid.CronExpression
|
||||
import java.util.Date
|
||||
import kotlin.math.atan2
|
||||
import kotlin.math.cos
|
||||
import kotlin.math.sin
|
||||
@ -12,9 +34,165 @@ class ConditionUtils private constructor() {
|
||||
|
||||
companion object {
|
||||
|
||||
private val TAG: String = ConditionUtils::class.java.simpleName
|
||||
|
||||
//遍历条件列表,判断是否满足条件,默认不校验第一个条件(第一个条件是触发条件)
|
||||
fun checkCondition(taskId: Long, conditionList: MutableList<TaskSetting>, startIndex: Int = 1): Boolean {
|
||||
if (startIndex >= conditionList.size) {
|
||||
Log.d(TAG, "TASK-$taskId:no condition need to check")
|
||||
return true
|
||||
}
|
||||
|
||||
//注意:触发条件 = SIM卡已准备就绪时,延迟5秒(给够搜索信号时间)才执行任务
|
||||
val firstCondition = conditionList.firstOrNull()
|
||||
val needDelay = firstCondition?.type == TASK_CONDITION_SIM && TaskUtils.simState == 5
|
||||
|
||||
for (i in startIndex until conditionList.size) {
|
||||
val condition = conditionList[i]
|
||||
when (condition.type) {
|
||||
TASK_CONDITION_CRON -> {
|
||||
val cronSetting = Gson().fromJson(condition.setting, CronSetting::class.java)
|
||||
if (cronSetting == null) {
|
||||
Log.d(TAG, "TASK-$taskId:cronSetting is null")
|
||||
continue
|
||||
}
|
||||
|
||||
val currentDate = if (needDelay) Date((Date().time / 1000) * 1000 - DELAY_TIME_AFTER_SIM_READY) else Date()
|
||||
currentDate.time = currentDate.time / 1000 * 1000
|
||||
val previousSecond = Date(currentDate.time - 1000)
|
||||
val cronExpression = CronExpression(cronSetting.expression)
|
||||
val nextValidTime = cronExpression.getNextValidTimeAfter(previousSecond)
|
||||
nextValidTime.time = nextValidTime.time / 1000 * 1000
|
||||
if (currentDate.time != nextValidTime.time) {
|
||||
Log.d(TAG, "TASK-$taskId:cron condition is not satisfied")
|
||||
return false
|
||||
}
|
||||
}
|
||||
|
||||
TASK_CONDITION_TO_ADDRESS, TASK_CONDITION_LEAVE_ADDRESS -> {
|
||||
val locationSetting = Gson().fromJson(condition.setting, LocationSetting::class.java)
|
||||
if (locationSetting == null) {
|
||||
Log.d(TAG, "TASK-$taskId:locationSetting is null")
|
||||
continue
|
||||
}
|
||||
val locationOld = TaskUtils.locationInfoOld
|
||||
val locationNew = TaskUtils.locationInfoNew
|
||||
if (locationSetting.calcType == "distance") {
|
||||
val distanceOld = calculateDistance(locationOld.latitude, locationOld.longitude, locationSetting.latitude, locationSetting.longitude)
|
||||
val distanceNew = calculateDistance(locationNew.latitude, locationNew.longitude, locationSetting.latitude, locationSetting.longitude)
|
||||
if (locationSetting.type == "to" && distanceOld > locationSetting.distance && distanceNew <= locationSetting.distance) {
|
||||
continue
|
||||
} else if (locationSetting.type == "leave" && distanceOld <= locationSetting.distance && distanceNew > locationSetting.distance) {
|
||||
continue
|
||||
}
|
||||
} else if (locationSetting.calcType == "address") {
|
||||
if (locationSetting.type == "to" && !locationOld.address.contains(locationSetting.address) && locationNew.address.contains(locationSetting.address)) {
|
||||
continue
|
||||
} else if (locationSetting.type == "leave" && locationOld.address.contains(locationSetting.address) && !locationNew.address.contains(locationSetting.address)) {
|
||||
continue
|
||||
}
|
||||
}
|
||||
return false
|
||||
}
|
||||
|
||||
TASK_CONDITION_NETWORK -> {
|
||||
val networkSetting = Gson().fromJson(condition.setting, NetworkSetting::class.java)
|
||||
if (networkSetting == null) {
|
||||
Log.d(TAG, "TASK-$taskId:networkSetting is null")
|
||||
continue
|
||||
}
|
||||
|
||||
if (TaskUtils.networkState != networkSetting.networkState) {
|
||||
Log.d(TAG, "TASK-$taskId:networkState is not match, networkSetting = $networkSetting")
|
||||
return false
|
||||
}
|
||||
|
||||
//移动网络
|
||||
if (networkSetting.networkState == 1 && networkSetting.dataSimSlot != 0 && TaskUtils.dataSimSlot != networkSetting.dataSimSlot) {
|
||||
Log.d(TAG, "TASK-$taskId:dataSimSlot is not match, networkSetting = $networkSetting")
|
||||
return false
|
||||
}
|
||||
|
||||
//WiFi
|
||||
else if (networkSetting.networkState == 2 && networkSetting.wifiSsid.isNotEmpty() && TaskUtils.wifiSsid != networkSetting.wifiSsid) {
|
||||
Log.d(TAG, "TASK-$taskId:wifiSsid is not match, networkSetting = $networkSetting")
|
||||
return false
|
||||
}
|
||||
}
|
||||
|
||||
TASK_CONDITION_SIM -> {
|
||||
val simSetting = Gson().fromJson(condition.setting, SimSetting::class.java)
|
||||
if (simSetting == null) {
|
||||
Log.d(TAG, "TASK-$taskId:simSetting is null")
|
||||
continue
|
||||
}
|
||||
if (TaskUtils.simState != simSetting.simState) {
|
||||
Log.d(TAG, "TASK-$taskId:simState is not match, simSetting = $simSetting")
|
||||
return false
|
||||
}
|
||||
}
|
||||
|
||||
TASK_CONDITION_BATTERY -> {
|
||||
val batteryLevel = TaskUtils.batteryLevel
|
||||
val batteryStatus = TaskUtils.batteryStatus
|
||||
val batterySetting = Gson().fromJson(condition.setting, BatterySetting::class.java)
|
||||
if (batterySetting == null) {
|
||||
Log.d(TAG, "TASK-$taskId:batterySetting is null")
|
||||
continue
|
||||
}
|
||||
when (batteryStatus) {
|
||||
BatteryManager.BATTERY_STATUS_CHARGING, BatteryManager.BATTERY_STATUS_FULL -> { //充电中
|
||||
if (batterySetting.status != BatteryManager.BATTERY_STATUS_CHARGING) return false
|
||||
if (batterySetting.keepReminding && batteryLevel >= batterySetting.levelMax) {
|
||||
continue
|
||||
} else if (!batterySetting.keepReminding && batteryLevel == batterySetting.levelMax) {
|
||||
continue
|
||||
}
|
||||
}
|
||||
|
||||
BatteryManager.BATTERY_STATUS_DISCHARGING, BatteryManager.BATTERY_STATUS_NOT_CHARGING -> { //放电中
|
||||
if (batterySetting.status != BatteryManager.BATTERY_STATUS_DISCHARGING) return false
|
||||
if (batterySetting.keepReminding && batteryLevel <= batterySetting.levelMin) {
|
||||
continue
|
||||
} else if (!batterySetting.keepReminding && batteryLevel == batterySetting.levelMin) {
|
||||
continue
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
TASK_CONDITION_CHARGE -> {
|
||||
val chargeSetting = Gson().fromJson(condition.setting, ChargeSetting::class.java)
|
||||
if (chargeSetting == null) {
|
||||
Log.d(TAG, "TASK-$taskId:chargeSetting is null")
|
||||
continue
|
||||
}
|
||||
val batteryStatus = TaskUtils.batteryStatus
|
||||
val batteryPlugged = TaskUtils.batteryPlugged
|
||||
if (batteryStatus != chargeSetting.status || batteryPlugged != chargeSetting.plugged) {
|
||||
return false
|
||||
}
|
||||
}
|
||||
|
||||
TASK_CONDITION_LOCK_SCREEN -> {
|
||||
val lockScreenSetting = Gson().fromJson(condition.setting, LockScreenSetting::class.java)
|
||||
if (lockScreenSetting == null) {
|
||||
Log.d(TAG, "TASK-$taskId:lockScreenSetting is null")
|
||||
continue
|
||||
}
|
||||
if (TaskUtils.lockScreenAction != lockScreenSetting.action) {
|
||||
return false
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
return true
|
||||
}
|
||||
|
||||
//计算两个经纬度之间的距离
|
||||
fun calculateDistance(lat1: Double, lon1: Double, lat2: Double, lon2: Double): Double {
|
||||
val earthRadius = 6371000.0 // 地球平均半径,单位:米
|
||||
val earthRadius = 6378137.0 // 地球平均半径,单位:米
|
||||
val latDistance = Math.toRadians(lat2 - lat1)
|
||||
val lonDistance = Math.toRadians(lon2 - lon1)
|
||||
val a = sin(latDistance / 2) * sin(latDistance / 2) + cos(Math.toRadians(lat1)) * cos(Math.toRadians(lat2)) * sin(lonDistance / 2) * sin(lonDistance / 2)
|
||||
|
@ -15,7 +15,7 @@ class CronJobScheduler {
|
||||
|
||||
companion object {
|
||||
|
||||
private const val TAG: String = "CronJobScheduler"
|
||||
private val TAG: String = CronJobScheduler::class.java.simpleName
|
||||
|
||||
fun scheduleTask(task: Task) {
|
||||
val currentTimeMillis = System.currentTimeMillis()
|
||||
|
@ -11,6 +11,9 @@ import com.idormy.sms.forwarder.utils.SP_BATTERY_STATUS
|
||||
import com.idormy.sms.forwarder.utils.SP_DATA_SIM_SLOT
|
||||
import com.idormy.sms.forwarder.utils.SP_IPV4
|
||||
import com.idormy.sms.forwarder.utils.SP_IPV6
|
||||
import com.idormy.sms.forwarder.utils.SP_LOCATION_INFO_NEW
|
||||
import com.idormy.sms.forwarder.utils.SP_LOCATION_INFO_OLD
|
||||
import com.idormy.sms.forwarder.utils.SP_LOCK_SCREEN_ACTION
|
||||
import com.idormy.sms.forwarder.utils.SP_NETWORK_STATE
|
||||
import com.idormy.sms.forwarder.utils.SP_SIM_STATE
|
||||
import com.idormy.sms.forwarder.utils.SP_WIFI_SSID
|
||||
@ -107,7 +110,13 @@ class TaskUtils private constructor() {
|
||||
var simState: Int by SharedPreference(SP_SIM_STATE, 0)
|
||||
|
||||
//上次定位信息
|
||||
var lastLocationInfo: LocationInfo by SharedPreference("lastLocationInfo", LocationInfo())
|
||||
var locationInfoOld: LocationInfo by SharedPreference(SP_LOCATION_INFO_OLD, LocationInfo())
|
||||
|
||||
//当前定位信息
|
||||
var locationInfoNew: LocationInfo by SharedPreference(SP_LOCATION_INFO_NEW, LocationInfo())
|
||||
|
||||
//上次锁屏广播
|
||||
var lockScreenAction: String by SharedPreference(SP_LOCK_SCREEN_ACTION, "")
|
||||
|
||||
}
|
||||
}
|
@ -17,6 +17,7 @@ import com.idormy.sms.forwarder.entity.task.TaskSetting
|
||||
import com.idormy.sms.forwarder.utils.TASK_CONDITION_BATTERY
|
||||
import com.idormy.sms.forwarder.utils.TASK_CONDITION_CHARGE
|
||||
import com.idormy.sms.forwarder.utils.TaskWorker
|
||||
import com.idormy.sms.forwarder.utils.task.ConditionUtils
|
||||
import com.idormy.sms.forwarder.utils.task.TaskUtils
|
||||
import java.util.Date
|
||||
|
||||
@ -123,6 +124,10 @@ class BatteryWorker(context: Context, params: WorkerParameters) : CoroutineWorke
|
||||
}
|
||||
|
||||
//TODO:判断其他条件是否满足
|
||||
if (!ConditionUtils.checkCondition(task.id, conditionList)) {
|
||||
Log.d(TAG, "TASK-${task.id}:other condition is not satisfied")
|
||||
continue
|
||||
}
|
||||
|
||||
//TODO: 组装消息体 && 执行具体任务
|
||||
val msgInfo = MsgInfo("task", task.name, msg, Date(), task.description)
|
||||
|
@ -14,6 +14,7 @@ import com.idormy.sms.forwarder.entity.MsgInfo
|
||||
import com.idormy.sms.forwarder.entity.task.CronSetting
|
||||
import com.idormy.sms.forwarder.entity.task.TaskSetting
|
||||
import com.idormy.sms.forwarder.utils.TaskWorker
|
||||
import com.idormy.sms.forwarder.utils.task.ConditionUtils
|
||||
import com.idormy.sms.forwarder.utils.task.CronJobScheduler
|
||||
import gatewayapps.crondroid.CronExpression
|
||||
import java.util.Date
|
||||
@ -54,8 +55,8 @@ class CronWorker(context: Context, params: WorkerParameters) : CoroutineWorker(c
|
||||
}
|
||||
|
||||
// TODO: 判断其他条件是否满足
|
||||
if (false) {
|
||||
Log.d(TAG, "TASK-${task.id}:其他条件不满足")
|
||||
if (!ConditionUtils.checkCondition(task.id, conditionList)) {
|
||||
Log.d(TAG, "TASK-${task.id}:other condition is not satisfied")
|
||||
return Result.failure()
|
||||
}
|
||||
|
||||
@ -84,11 +85,7 @@ class CronWorker(context: Context, params: WorkerParameters) : CoroutineWorker(c
|
||||
|
||||
//TODO: 组装消息体 && 执行具体任务
|
||||
val msgInfo = MsgInfo("task", task.name, task.description, Date(), task.name)
|
||||
val actionData = Data.Builder()
|
||||
.putLong(TaskWorker.taskId, task.id)
|
||||
.putString(TaskWorker.taskActions, task.actions)
|
||||
.putString(TaskWorker.msgInfo, Gson().toJson(msgInfo))
|
||||
.build()
|
||||
val actionData = Data.Builder().putLong(TaskWorker.taskId, task.id).putString(TaskWorker.taskActions, task.actions).putString(TaskWorker.msgInfo, Gson().toJson(msgInfo)).build()
|
||||
val actionRequest = OneTimeWorkRequestBuilder<ActionWorker>().setInputData(actionData).build()
|
||||
WorkManager.getInstance().enqueue(actionRequest)
|
||||
|
||||
|
@ -18,6 +18,7 @@ import com.idormy.sms.forwarder.entity.task.TaskSetting
|
||||
import com.idormy.sms.forwarder.utils.TASK_CONDITION_LEAVE_ADDRESS
|
||||
import com.idormy.sms.forwarder.utils.TASK_CONDITION_TO_ADDRESS
|
||||
import com.idormy.sms.forwarder.utils.TaskWorker
|
||||
import com.idormy.sms.forwarder.utils.task.ConditionUtils
|
||||
import com.idormy.sms.forwarder.utils.task.ConditionUtils.Companion.calculateDistance
|
||||
import com.xuexiang.xutil.resource.ResUtils.getString
|
||||
import java.util.Date
|
||||
@ -95,6 +96,12 @@ class LocationWorker(context: Context, params: WorkerParameters) : CoroutineWork
|
||||
continue
|
||||
}
|
||||
|
||||
//TODO:判断其他条件是否满足
|
||||
if (!ConditionUtils.checkCondition(task.id, conditionList)) {
|
||||
Log.d(TAG, "TASK-${task.id}:other condition is not satisfied")
|
||||
continue
|
||||
}
|
||||
|
||||
//TODO: 组装消息体 && 执行具体任务
|
||||
val msgInfo = MsgInfo("task", task.name, locationNew.toString(), Date(), description)
|
||||
val actionData = Data.Builder().putLong(TaskWorker.taskId, task.id).putString(TaskWorker.taskActions, task.actions).putString(TaskWorker.msgInfo, Gson().toJson(msgInfo)).build()
|
||||
@ -152,6 +159,12 @@ class LocationWorker(context: Context, params: WorkerParameters) : CoroutineWork
|
||||
continue
|
||||
}
|
||||
|
||||
//TODO:判断其他条件是否满足
|
||||
if (!ConditionUtils.checkCondition(task.id, conditionList)) {
|
||||
Log.d(TAG, "TASK-${task.id}:other condition is not satisfied")
|
||||
continue
|
||||
}
|
||||
|
||||
//TODO: 组装消息体 && 执行具体任务
|
||||
val msgInfo = MsgInfo("task", task.name, locationNew.toString(), Date(), description)
|
||||
val actionData = Data.Builder().putLong(TaskWorker.taskId, task.id).putString(TaskWorker.taskActions, task.actions).putString(TaskWorker.msgInfo, Gson().toJson(msgInfo)).build()
|
||||
|
@ -15,6 +15,7 @@ import com.idormy.sms.forwarder.entity.MsgInfo
|
||||
import com.idormy.sms.forwarder.entity.task.LockScreenSetting
|
||||
import com.idormy.sms.forwarder.entity.task.TaskSetting
|
||||
import com.idormy.sms.forwarder.utils.TaskWorker
|
||||
import com.idormy.sms.forwarder.utils.task.ConditionUtils
|
||||
import java.util.Date
|
||||
import java.util.concurrent.TimeUnit
|
||||
|
||||
@ -55,9 +56,11 @@ class LockScreenWorker(context: Context, params: WorkerParameters) : CoroutineWo
|
||||
continue
|
||||
}
|
||||
|
||||
val duration = if (action == Intent.ACTION_SCREEN_ON) lockScreenSetting.timeAfterScreenOn else lockScreenSetting.timeAfterScreenOff
|
||||
|
||||
//TODO:判断其他条件是否满足
|
||||
if (!ConditionUtils.checkCondition(task.id, conditionList)) {
|
||||
Log.d(TAG, "TASK-${task.id}:other condition is not satisfied")
|
||||
continue
|
||||
}
|
||||
|
||||
//TODO: 组装消息体 && 执行具体任务
|
||||
val msgInfo = MsgInfo("task", task.name, lockScreenSetting.description, Date(), task.description)
|
||||
@ -66,6 +69,7 @@ class LockScreenWorker(context: Context, params: WorkerParameters) : CoroutineWo
|
||||
.putString(TaskWorker.taskActions, task.actions)
|
||||
.putString(TaskWorker.msgInfo, Gson().toJson(msgInfo))
|
||||
.build()
|
||||
val duration = if (action == Intent.ACTION_SCREEN_ON) lockScreenSetting.timeAfterScreenOn else lockScreenSetting.timeAfterScreenOff
|
||||
val actionRequest = OneTimeWorkRequestBuilder<ActionWorker>()
|
||||
.setInitialDelay(duration.toLong(), TimeUnit.MINUTES)
|
||||
.setInputData(actionData).build()
|
||||
|
@ -16,6 +16,7 @@ import com.idormy.sms.forwarder.entity.task.NetworkSetting
|
||||
import com.idormy.sms.forwarder.entity.task.TaskSetting
|
||||
import com.idormy.sms.forwarder.utils.PhoneUtils
|
||||
import com.idormy.sms.forwarder.utils.TaskWorker
|
||||
import com.idormy.sms.forwarder.utils.task.ConditionUtils
|
||||
import com.idormy.sms.forwarder.utils.task.TaskUtils
|
||||
import com.xuexiang.xutil.app.ServiceUtils
|
||||
import com.xuexiang.xutil.resource.ResUtils.getString
|
||||
@ -60,6 +61,10 @@ class NetworkWorker(context: Context, params: WorkerParameters) : CoroutineWorke
|
||||
}
|
||||
|
||||
//TODO:判断其他条件是否满足
|
||||
if (!ConditionUtils.checkCondition(task.id, conditionList)) {
|
||||
Log.d(TAG, "TASK-${task.id}:other condition is not satisfied")
|
||||
continue
|
||||
}
|
||||
|
||||
var ipv4 = ""
|
||||
var ipv6 = ""
|
||||
|
@ -17,6 +17,7 @@ import com.idormy.sms.forwarder.entity.task.SimSetting
|
||||
import com.idormy.sms.forwarder.entity.task.TaskSetting
|
||||
import com.idormy.sms.forwarder.utils.PhoneUtils
|
||||
import com.idormy.sms.forwarder.utils.TaskWorker
|
||||
import com.idormy.sms.forwarder.utils.task.ConditionUtils
|
||||
import com.idormy.sms.forwarder.utils.task.TaskUtils
|
||||
import com.xuexiang.xutil.resource.ResUtils
|
||||
import java.util.Date
|
||||
@ -56,11 +57,11 @@ class SimWorker(context: Context, params: WorkerParameters) : CoroutineWorker(co
|
||||
continue
|
||||
}
|
||||
|
||||
//TODO:判断其他条件是否满足,注意:SIM卡已准备就绪,延迟5秒才进入这里(给够搜索信号时间)
|
||||
/*if (!TaskUtils.isConditionMatch(task, msg)) {
|
||||
Log.d(TAG, "TASK-${task.id}:condition is not match")
|
||||
//TODO:判断其他条件是否满足,注意:SIM卡已准备就绪时,延迟5秒(给够搜索信号时间)才执行任务
|
||||
if (!ConditionUtils.checkCondition(task.id, conditionList)) {
|
||||
Log.d(TAG, "TASK-${task.id}:other condition is not satisfied")
|
||||
continue
|
||||
}*/
|
||||
}
|
||||
|
||||
val msg = StringBuilder()
|
||||
msg.append(String.format(ResUtils.getString(R.string.sim_state), simStateStr)).append("\n")
|
||||
|
@ -345,10 +345,15 @@
|
||||
</LinearLayout>
|
||||
|
||||
<LinearLayout
|
||||
style="@style/settingBarStyle"
|
||||
android:layout_width="match_parent"
|
||||
android:layout_height="wrap_content"
|
||||
android:orientation="vertical">
|
||||
android:layout_marginTop="5dp"
|
||||
android:background="@color/setting_bar_color"
|
||||
android:gravity="center_vertical"
|
||||
android:orientation="vertical"
|
||||
android:paddingStart="10dp"
|
||||
android:paddingTop="10dp"
|
||||
android:paddingEnd="10dp">
|
||||
|
||||
<LinearLayout
|
||||
android:layout_width="match_parent"
|
||||
@ -386,147 +391,156 @@
|
||||
</LinearLayout>
|
||||
|
||||
<LinearLayout
|
||||
android:id="@+id/layout_location_setting"
|
||||
android:layout_width="match_parent"
|
||||
android:layout_height="wrap_content"
|
||||
android:gravity="center_vertical"
|
||||
android:orientation="horizontal">
|
||||
android:orientation="vertical"
|
||||
android:visibility="gone">
|
||||
|
||||
<TextView
|
||||
android:layout_width="wrap_content"
|
||||
<LinearLayout
|
||||
android:layout_width="match_parent"
|
||||
android:layout_height="wrap_content"
|
||||
android:text="@string/accuracy"
|
||||
android:textSize="10sp"
|
||||
android:textStyle="bold"
|
||||
tools:ignore="SmallSp" />
|
||||
|
||||
<RadioGroup
|
||||
android:id="@+id/rg_accuracy"
|
||||
style="@style/rg_style"
|
||||
android:layout_marginStart="5dp"
|
||||
android:gravity="center_vertical"
|
||||
android:orientation="horizontal">
|
||||
|
||||
<RadioButton
|
||||
android:id="@+id/rb_accuracy_fine"
|
||||
style="@style/rg_rb_style_wrap"
|
||||
android:checked="true"
|
||||
android:text="@string/accuracy_fine" />
|
||||
<TextView
|
||||
android:layout_width="wrap_content"
|
||||
android:layout_height="wrap_content"
|
||||
android:text="@string/accuracy"
|
||||
android:textSize="10sp"
|
||||
android:textStyle="bold"
|
||||
tools:ignore="SmallSp" />
|
||||
|
||||
<RadioButton
|
||||
android:id="@+id/rb_accuracy_coarse"
|
||||
style="@style/rg_rb_style_wrap"
|
||||
android:text="@string/accuracy_coarse" />
|
||||
<RadioGroup
|
||||
android:id="@+id/rg_accuracy"
|
||||
style="@style/rg_style"
|
||||
android:layout_marginStart="5dp"
|
||||
android:orientation="horizontal">
|
||||
|
||||
<RadioButton
|
||||
android:id="@+id/rb_accuracy_no_requirement"
|
||||
style="@style/rg_rb_style_wrap"
|
||||
android:text="@string/no_requirement" />
|
||||
<RadioButton
|
||||
android:id="@+id/rb_accuracy_fine"
|
||||
style="@style/rg_rb_style_wrap"
|
||||
android:checked="true"
|
||||
android:text="@string/accuracy_fine" />
|
||||
|
||||
</RadioGroup>
|
||||
<RadioButton
|
||||
android:id="@+id/rb_accuracy_coarse"
|
||||
style="@style/rg_rb_style_wrap"
|
||||
android:text="@string/accuracy_coarse" />
|
||||
|
||||
</LinearLayout>
|
||||
<RadioButton
|
||||
android:id="@+id/rb_accuracy_no_requirement"
|
||||
style="@style/rg_rb_style_wrap"
|
||||
android:text="@string/no_requirement" />
|
||||
|
||||
<LinearLayout
|
||||
android:layout_width="match_parent"
|
||||
android:layout_height="wrap_content"
|
||||
android:gravity="center_vertical"
|
||||
android:orientation="horizontal">
|
||||
</RadioGroup>
|
||||
|
||||
<TextView
|
||||
android:layout_width="wrap_content"
|
||||
</LinearLayout>
|
||||
|
||||
<LinearLayout
|
||||
android:layout_width="match_parent"
|
||||
android:layout_height="wrap_content"
|
||||
android:text="@string/power_requirement"
|
||||
android:textSize="10sp"
|
||||
android:textStyle="bold"
|
||||
tools:ignore="SmallSp" />
|
||||
|
||||
<RadioGroup
|
||||
android:id="@+id/rg_power_requirement"
|
||||
style="@style/rg_style"
|
||||
android:layout_marginStart="5dp"
|
||||
android:gravity="center_vertical"
|
||||
android:orientation="horizontal">
|
||||
|
||||
<RadioButton
|
||||
android:id="@+id/rb_power_requirement_low"
|
||||
style="@style/rg_rb_style_wrap"
|
||||
android:checked="true"
|
||||
android:text="@string/power_requirement_low" />
|
||||
<TextView
|
||||
android:layout_width="wrap_content"
|
||||
android:layout_height="wrap_content"
|
||||
android:text="@string/power_requirement"
|
||||
android:textSize="10sp"
|
||||
android:textStyle="bold"
|
||||
tools:ignore="SmallSp" />
|
||||
|
||||
<RadioButton
|
||||
android:id="@+id/rb_power_requirement_medium"
|
||||
style="@style/rg_rb_style_wrap"
|
||||
android:text="@string/power_requirement_medium" />
|
||||
<RadioGroup
|
||||
android:id="@+id/rg_power_requirement"
|
||||
style="@style/rg_style"
|
||||
android:layout_marginStart="5dp"
|
||||
android:orientation="horizontal">
|
||||
|
||||
<RadioButton
|
||||
android:id="@+id/rb_power_requirement_high"
|
||||
style="@style/rg_rb_style_wrap"
|
||||
android:text="@string/power_requirement_high" />
|
||||
<RadioButton
|
||||
android:id="@+id/rb_power_requirement_low"
|
||||
style="@style/rg_rb_style_wrap"
|
||||
android:checked="true"
|
||||
android:text="@string/power_requirement_low" />
|
||||
|
||||
<RadioButton
|
||||
android:id="@+id/rb_power_requirement_no_requirement"
|
||||
style="@style/rg_rb_style_wrap"
|
||||
android:text="@string/no_requirement" />
|
||||
<RadioButton
|
||||
android:id="@+id/rb_power_requirement_medium"
|
||||
style="@style/rg_rb_style_wrap"
|
||||
android:text="@string/power_requirement_medium" />
|
||||
|
||||
</RadioGroup>
|
||||
<RadioButton
|
||||
android:id="@+id/rb_power_requirement_high"
|
||||
style="@style/rg_rb_style_wrap"
|
||||
android:text="@string/power_requirement_high" />
|
||||
|
||||
</LinearLayout>
|
||||
<RadioButton
|
||||
android:id="@+id/rb_power_requirement_no_requirement"
|
||||
style="@style/rg_rb_style_wrap"
|
||||
android:text="@string/no_requirement" />
|
||||
|
||||
<LinearLayout
|
||||
android:layout_width="match_parent"
|
||||
android:layout_height="wrap_content"
|
||||
android:layout_marginEnd="@dimen/config_margin_10dp"
|
||||
android:gravity="center_vertical"
|
||||
android:orientation="horizontal">
|
||||
</RadioGroup>
|
||||
|
||||
<TextView
|
||||
android:layout_width="wrap_content"
|
||||
</LinearLayout>
|
||||
|
||||
<LinearLayout
|
||||
android:layout_width="match_parent"
|
||||
android:layout_height="wrap_content"
|
||||
android:text="@string/min_interval"
|
||||
android:textSize="10sp"
|
||||
android:textStyle="bold"
|
||||
tools:ignore="SmallSp" />
|
||||
android:layout_marginEnd="@dimen/config_margin_10dp"
|
||||
android:gravity="center_vertical"
|
||||
android:orientation="horizontal">
|
||||
|
||||
<com.xuexiang.xui.widget.picker.XSeekBar
|
||||
android:id="@+id/xsb_min_interval"
|
||||
android:layout_width="0dp"
|
||||
android:layout_height="wrap_content"
|
||||
android:layout_marginStart="5dp"
|
||||
android:layout_weight="1"
|
||||
app:xsb_max="120"
|
||||
app:xsb_min="1" />
|
||||
<TextView
|
||||
android:layout_width="wrap_content"
|
||||
android:layout_height="wrap_content"
|
||||
android:text="@string/min_interval"
|
||||
android:textSize="10sp"
|
||||
android:textStyle="bold"
|
||||
tools:ignore="SmallSp" />
|
||||
|
||||
<TextView
|
||||
android:layout_width="wrap_content"
|
||||
android:layout_height="wrap_content"
|
||||
android:layout_marginStart="5dp"
|
||||
android:text="@string/seconds"
|
||||
android:textSize="12sp"
|
||||
android:textStyle="bold" />
|
||||
<com.xuexiang.xui.widget.picker.XSeekBar
|
||||
android:id="@+id/xsb_min_interval"
|
||||
android:layout_width="0dp"
|
||||
android:layout_height="wrap_content"
|
||||
android:layout_marginStart="5dp"
|
||||
android:layout_weight="1"
|
||||
app:xsb_max="120"
|
||||
app:xsb_min="1" />
|
||||
|
||||
<TextView
|
||||
android:layout_width="wrap_content"
|
||||
android:layout_height="wrap_content"
|
||||
android:layout_marginStart="@dimen/config_margin_10dp"
|
||||
android:text="@string/min_distance"
|
||||
android:textSize="10sp"
|
||||
android:textStyle="bold"
|
||||
tools:ignore="SmallSp" />
|
||||
<TextView
|
||||
android:layout_width="wrap_content"
|
||||
android:layout_height="wrap_content"
|
||||
android:layout_marginStart="5dp"
|
||||
android:text="@string/seconds"
|
||||
android:textSize="12sp"
|
||||
android:textStyle="bold" />
|
||||
|
||||
<com.xuexiang.xui.widget.picker.XSeekBar
|
||||
android:id="@+id/xsb_min_distance"
|
||||
android:layout_width="0dp"
|
||||
android:layout_height="wrap_content"
|
||||
android:layout_marginStart="5dp"
|
||||
android:layout_weight="1"
|
||||
app:xsb_max="120"
|
||||
app:xsb_min="0" />
|
||||
<TextView
|
||||
android:layout_width="wrap_content"
|
||||
android:layout_height="wrap_content"
|
||||
android:layout_marginStart="@dimen/config_margin_10dp"
|
||||
android:text="@string/min_distance"
|
||||
android:textSize="10sp"
|
||||
android:textStyle="bold"
|
||||
tools:ignore="SmallSp" />
|
||||
|
||||
<TextView
|
||||
android:layout_width="wrap_content"
|
||||
android:layout_height="wrap_content"
|
||||
android:layout_marginStart="5dp"
|
||||
android:text="@string/meter"
|
||||
android:textSize="12sp"
|
||||
android:textStyle="bold" />
|
||||
<com.xuexiang.xui.widget.picker.XSeekBar
|
||||
android:id="@+id/xsb_min_distance"
|
||||
android:layout_width="0dp"
|
||||
android:layout_height="wrap_content"
|
||||
android:layout_marginStart="5dp"
|
||||
android:layout_weight="1"
|
||||
app:xsb_max="120"
|
||||
app:xsb_min="0" />
|
||||
|
||||
<TextView
|
||||
android:layout_width="wrap_content"
|
||||
android:layout_height="wrap_content"
|
||||
android:layout_marginStart="5dp"
|
||||
android:text="@string/meter"
|
||||
android:textSize="12sp"
|
||||
android:textStyle="bold" />
|
||||
|
||||
</LinearLayout>
|
||||
|
||||
</LinearLayout>
|
||||
|
||||
@ -1072,11 +1086,14 @@
|
||||
</LinearLayout>
|
||||
|
||||
<LinearLayout
|
||||
style="@style/settingBarStyle"
|
||||
android:layout_width="match_parent"
|
||||
android:layout_height="wrap_content"
|
||||
android:layout_marginTop="5dp"
|
||||
android:background="@color/setting_bar_color"
|
||||
android:baselineAligned="false"
|
||||
android:paddingEnd="15dp"
|
||||
android:gravity="center_vertical"
|
||||
android:paddingStart="10dp"
|
||||
android:paddingTop="10dp"
|
||||
tools:ignore="RtlSymmetry">
|
||||
|
||||
<LinearLayout
|
||||
@ -1123,7 +1140,7 @@
|
||||
android:layout_height="wrap_content"
|
||||
android:layout_marginStart="5dp"
|
||||
android:layout_weight="1"
|
||||
app:xsb_max="30"
|
||||
app:xsb_max="10"
|
||||
app:xsb_min="0" />
|
||||
|
||||
<TextView
|
||||
@ -1154,7 +1171,7 @@
|
||||
android:layout_height="wrap_content"
|
||||
android:layout_marginStart="5dp"
|
||||
android:layout_weight="1"
|
||||
app:xsb_max="99"
|
||||
app:xsb_max="60"
|
||||
app:xsb_min="1" />
|
||||
|
||||
<TextView
|
||||
@ -1185,7 +1202,7 @@
|
||||
android:layout_height="wrap_content"
|
||||
android:layout_marginStart="5dp"
|
||||
android:layout_weight="1"
|
||||
app:xsb_max="99"
|
||||
app:xsb_max="60"
|
||||
app:xsb_min="1" />
|
||||
|
||||
<TextView
|
||||
|
Loading…
x
Reference in New Issue
Block a user