From 41c0e1923ab78673efde98acc6ee6eea99b252f5 Mon Sep 17 00:00:00 2001 From: pppscn <35696959@qq.com> Date: Sat, 16 Dec 2023 19:30:16 +0800 Subject: [PATCH] =?UTF-8?q?=E6=96=B0=E5=A2=9E=EF=BC=9A=E8=87=AA=E5=8A=A8?= =?UTF-8?q?=E4=BB=BB=E5=8A=A1=C2=B7=E5=BF=AB=E6=8D=B7=E6=8C=87=E4=BB=A4=20?= =?UTF-8?q?=EF=BC=88=E5=BC=80=E5=8F=91=E4=B8=AD=EF=BC=89?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../forwarder/entity/task/LocationSetting.kt | 22 -- .../forwarder/fragment/SettingsFragment.kt | 6 +- .../forwarder/receiver/LockScreenReceiver.kt | 2 + .../forwarder/receiver/SimStateReceiver.kt | 3 +- .../sms/forwarder/service/LocationService.kt | 10 +- .../idormy/sms/forwarder/utils/Constants.kt | 8 +- .../forwarder/utils/task/ConditionUtils.kt | 180 +++++++++++- .../forwarder/utils/task/CronJobScheduler.kt | 2 +- .../sms/forwarder/utils/task/TaskUtils.kt | 11 +- .../sms/forwarder/workers/BatteryWorker.kt | 5 + .../sms/forwarder/workers/CronWorker.kt | 11 +- .../sms/forwarder/workers/LocationWorker.kt | 13 + .../sms/forwarder/workers/LockScreenWorker.kt | 8 +- .../sms/forwarder/workers/NetworkWorker.kt | 5 + .../idormy/sms/forwarder/workers/SimWorker.kt | 9 +- app/src/main/res/layout/fragment_settings.xml | 257 ++++++++++-------- 16 files changed, 386 insertions(+), 166 deletions(-) diff --git a/app/src/main/java/com/idormy/sms/forwarder/entity/task/LocationSetting.kt b/app/src/main/java/com/idormy/sms/forwarder/entity/task/LocationSetting.kt index 71f0a498..08d08cd6 100644 --- a/app/src/main/java/com/idormy/sms/forwarder/entity/task/LocationSetting.kt +++ b/app/src/main/java/com/idormy/sms/forwarder/entity/task/LocationSetting.kt @@ -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 - } - } diff --git a/app/src/main/java/com/idormy/sms/forwarder/fragment/SettingsFragment.kt b/app/src/main/java/com/idormy/sms/forwarder/fragment/SettingsFragment.kt index c644b944..b948668a 100644 --- a/app/src/main/java/com/idormy/sms/forwarder/fragment/SettingsFragment.kt +++ b/app/src/main/java/com/idormy/sms/forwarder/fragment/SettingsFragment.kt @@ -164,7 +164,7 @@ class SettingsFragment : BaseFragment(), 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(), 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(), View.OnClickL } else { restartLocationService() } + layoutLocationSetting.visibility = if (isChecked) View.VISIBLE else View.GONE } //设置位置精度:高精度(默认) rgAccuracy.check( diff --git a/app/src/main/java/com/idormy/sms/forwarder/receiver/LockScreenReceiver.kt b/app/src/main/java/com/idormy/sms/forwarder/receiver/LockScreenReceiver.kt index 847121dd..1f4a0165 100644 --- a/app/src/main/java/com/idormy/sms/forwarder/receiver/LockScreenReceiver.kt +++ b/app/src/main/java/com/idormy/sms/forwarder/receiver/LockScreenReceiver.kt @@ -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().setInputData( workDataOf( TaskWorker.conditionType to TASK_CONDITION_LOCK_SCREEN, diff --git a/app/src/main/java/com/idormy/sms/forwarder/receiver/SimStateReceiver.kt b/app/src/main/java/com/idormy/sms/forwarder/receiver/SimStateReceiver.kt index b9e97e7d..28e93b7c 100644 --- a/app/src/main/java/com/idormy/sms/forwarder/receiver/SimStateReceiver.kt +++ b/app/src/main/java/com/idormy/sms/forwarder/receiver/SimStateReceiver.kt @@ -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) } diff --git a/app/src/main/java/com/idormy/sms/forwarder/service/LocationService.kt b/app/src/main/java/com/idormy/sms/forwarder/service/LocationService.kt index 318a20eb..7a9b7e64 100644 --- a/app/src/main/java/com/idormy/sms/forwarder/service/LocationService.kt +++ b/app/src/main/java/com/idormy/sms/forwarder/service/LocationService.kt @@ -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 { //如果已经开始定位,则先停止定位 diff --git a/app/src/main/java/com/idormy/sms/forwarder/utils/Constants.kt b/app/src/main/java/com/idormy/sms/forwarder/utils/Constants.kt index e31f5eac..6a8a57e3 100644 --- a/app/src/main/java/com/idormy/sms/forwarder/utils/Constants.kt +++ b/app/src/main/java/com/idormy/sms/forwarder/utils/Constants.kt @@ -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" \ No newline at end of file +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 \ No newline at end of file diff --git a/app/src/main/java/com/idormy/sms/forwarder/utils/task/ConditionUtils.kt b/app/src/main/java/com/idormy/sms/forwarder/utils/task/ConditionUtils.kt index 2864ec52..3d083e0b 100644 --- a/app/src/main/java/com/idormy/sms/forwarder/utils/task/ConditionUtils.kt +++ b/app/src/main/java/com/idormy/sms/forwarder/utils/task/ConditionUtils.kt @@ -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, 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) diff --git a/app/src/main/java/com/idormy/sms/forwarder/utils/task/CronJobScheduler.kt b/app/src/main/java/com/idormy/sms/forwarder/utils/task/CronJobScheduler.kt index d27011ff..59ef11aa 100644 --- a/app/src/main/java/com/idormy/sms/forwarder/utils/task/CronJobScheduler.kt +++ b/app/src/main/java/com/idormy/sms/forwarder/utils/task/CronJobScheduler.kt @@ -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() diff --git a/app/src/main/java/com/idormy/sms/forwarder/utils/task/TaskUtils.kt b/app/src/main/java/com/idormy/sms/forwarder/utils/task/TaskUtils.kt index d7d02a81..6db0007b 100644 --- a/app/src/main/java/com/idormy/sms/forwarder/utils/task/TaskUtils.kt +++ b/app/src/main/java/com/idormy/sms/forwarder/utils/task/TaskUtils.kt @@ -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, "") } } \ No newline at end of file diff --git a/app/src/main/java/com/idormy/sms/forwarder/workers/BatteryWorker.kt b/app/src/main/java/com/idormy/sms/forwarder/workers/BatteryWorker.kt index 946ecd83..71e85779 100644 --- a/app/src/main/java/com/idormy/sms/forwarder/workers/BatteryWorker.kt +++ b/app/src/main/java/com/idormy/sms/forwarder/workers/BatteryWorker.kt @@ -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) diff --git a/app/src/main/java/com/idormy/sms/forwarder/workers/CronWorker.kt b/app/src/main/java/com/idormy/sms/forwarder/workers/CronWorker.kt index ff50a0ae..04c5f95b 100644 --- a/app/src/main/java/com/idormy/sms/forwarder/workers/CronWorker.kt +++ b/app/src/main/java/com/idormy/sms/forwarder/workers/CronWorker.kt @@ -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().setInputData(actionData).build() WorkManager.getInstance().enqueue(actionRequest) diff --git a/app/src/main/java/com/idormy/sms/forwarder/workers/LocationWorker.kt b/app/src/main/java/com/idormy/sms/forwarder/workers/LocationWorker.kt index ee360db7..ba47513f 100644 --- a/app/src/main/java/com/idormy/sms/forwarder/workers/LocationWorker.kt +++ b/app/src/main/java/com/idormy/sms/forwarder/workers/LocationWorker.kt @@ -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() diff --git a/app/src/main/java/com/idormy/sms/forwarder/workers/LockScreenWorker.kt b/app/src/main/java/com/idormy/sms/forwarder/workers/LockScreenWorker.kt index fdc0052f..35175bfa 100644 --- a/app/src/main/java/com/idormy/sms/forwarder/workers/LockScreenWorker.kt +++ b/app/src/main/java/com/idormy/sms/forwarder/workers/LockScreenWorker.kt @@ -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() .setInitialDelay(duration.toLong(), TimeUnit.MINUTES) .setInputData(actionData).build() diff --git a/app/src/main/java/com/idormy/sms/forwarder/workers/NetworkWorker.kt b/app/src/main/java/com/idormy/sms/forwarder/workers/NetworkWorker.kt index 56327390..b52f58db 100644 --- a/app/src/main/java/com/idormy/sms/forwarder/workers/NetworkWorker.kt +++ b/app/src/main/java/com/idormy/sms/forwarder/workers/NetworkWorker.kt @@ -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 = "" diff --git a/app/src/main/java/com/idormy/sms/forwarder/workers/SimWorker.kt b/app/src/main/java/com/idormy/sms/forwarder/workers/SimWorker.kt index 5fedcc49..b47d944a 100644 --- a/app/src/main/java/com/idormy/sms/forwarder/workers/SimWorker.kt +++ b/app/src/main/java/com/idormy/sms/forwarder/workers/SimWorker.kt @@ -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") diff --git a/app/src/main/res/layout/fragment_settings.xml b/app/src/main/res/layout/fragment_settings.xml index 3698e046..f753a0d0 100644 --- a/app/src/main/res/layout/fragment_settings.xml +++ b/app/src/main/res/layout/fragment_settings.xml @@ -345,10 +345,15 @@ + 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"> + android:orientation="vertical" + android:visibility="gone"> - - - - + - + - + - + - + - + - + + - - - + - + - + - + - + - + - + - + + + android:layout_marginEnd="@dimen/config_margin_10dp" + android:gravity="center_vertical" + android:orientation="horizontal"> - + - + - + - + - + + + + + @@ -1072,11 +1086,14 @@