diff --git a/app/src/main/java/com/idormy/sms/forwarder/entity/condition/LockScreenSetting.kt b/app/src/main/java/com/idormy/sms/forwarder/entity/condition/LockScreenSetting.kt index 6c0f2ee7..e4938118 100644 --- a/app/src/main/java/com/idormy/sms/forwarder/entity/condition/LockScreenSetting.kt +++ b/app/src/main/java/com/idormy/sms/forwarder/entity/condition/LockScreenSetting.kt @@ -12,32 +12,37 @@ data class LockScreenSetting( var timeAfterScreenOn: Int = 5, //开锁后时间 var timeAfterScreenLocked: Int = 5, //锁屏后时间 var timeAfterScreenUnlocked: Int = 5, //解锁后时间 + var checkAgain: Boolean = false, //是否再次校验 ) : Serializable { - constructor(actionCheckId: Int, timeAfterOff: Int, timeAfterOn: Int, timeAfterLocked: Int, timeAfterUnlocked: Int) : this() { - when (actionCheckId) { + constructor(actionCheckId: Int, timeAfterOff: Int, timeAfterOn: Int, timeAfterLocked: Int, timeAfterUnlocked: Int, checkAgain: Boolean = false) : this() { + val duration = when (actionCheckId) { R.id.rb_action_screen_on -> { - val duration = if (timeAfterOn > 0) String.format(getString(R.string.duration_minute), timeAfterOn.toString()) else "" - description = String.format(getString(R.string.time_after_screen_on_description), duration) + val durationStr = if (timeAfterOn > 0) String.format(getString(R.string.duration_minute), timeAfterOn.toString()) else "" + description = String.format(getString(R.string.time_after_screen_on_description), durationStr) action = Intent.ACTION_SCREEN_ON + timeAfterOn } R.id.rb_action_screen_unlocked -> { - val duration = if (timeAfterUnlocked > 0) String.format(getString(R.string.duration_minute), timeAfterUnlocked.toString()) else "" - description = String.format(getString(R.string.time_after_screen_unlocked_description), duration) + val durationStr = if (timeAfterUnlocked > 0) String.format(getString(R.string.duration_minute), timeAfterUnlocked.toString()) else "" + description = String.format(getString(R.string.time_after_screen_unlocked_description), durationStr) action = Intent.ACTION_USER_PRESENT + timeAfterUnlocked } R.id.rb_action_screen_locked -> { - val duration = if (timeAfterLocked > 0) String.format(getString(R.string.duration_minute), timeAfterLocked.toString()) else "" - description = String.format(getString(R.string.time_after_screen_locked_description), duration) + val durationStr = if (timeAfterLocked > 0) String.format(getString(R.string.duration_minute), timeAfterLocked.toString()) else "" + description = String.format(getString(R.string.time_after_screen_locked_description), durationStr) action = Intent.ACTION_SCREEN_OFF + "_LOCKED" + timeAfterLocked } else -> { - val duration = if (timeAfterOff > 0) String.format(getString(R.string.duration_minute), timeAfterOff.toString()) else "" - description = String.format(getString(R.string.time_after_screen_off_description), duration) + val durationStr = if (timeAfterOff > 0) String.format(getString(R.string.duration_minute), timeAfterOff.toString()) else "" + description = String.format(getString(R.string.time_after_screen_off_description), durationStr) action = Intent.ACTION_SCREEN_OFF + timeAfterOff } } @@ -45,6 +50,10 @@ data class LockScreenSetting( timeAfterScreenOn = timeAfterOn timeAfterScreenLocked = timeAfterLocked timeAfterScreenUnlocked = timeAfterUnlocked + this.checkAgain = checkAgain + if (checkAgain && duration > 0) { + description += ", " + getString(R.string.task_condition_check_again) + } } fun getActionCheckId(): Int { @@ -55,4 +64,13 @@ data class LockScreenSetting( else -> R.id.rb_action_screen_locked } } + + fun getDuration(action: String): Int { + return when (action) { + Intent.ACTION_SCREEN_ON -> timeAfterScreenOn + Intent.ACTION_SCREEN_OFF -> timeAfterScreenOff + Intent.ACTION_USER_PRESENT -> timeAfterScreenUnlocked + else -> timeAfterScreenLocked + } + } } diff --git a/app/src/main/java/com/idormy/sms/forwarder/fragment/condition/LockScreenFragment.kt b/app/src/main/java/com/idormy/sms/forwarder/fragment/condition/LockScreenFragment.kt index a0f59f4e..086fc734 100644 --- a/app/src/main/java/com/idormy/sms/forwarder/fragment/condition/LockScreenFragment.kt +++ b/app/src/main/java/com/idormy/sms/forwarder/fragment/condition/LockScreenFragment.kt @@ -77,6 +77,7 @@ class LockScreenFragment : BaseFragment checkSetting(true) } + binding!!.xsbTimeAfterScreenLocked.setOnSeekBarListener { _, _ -> + checkSetting(true) + } + binding!!.xsbTimeAfterScreenUnlocked.setOnSeekBarListener { _, _ -> + checkSetting(true) + } + binding!!.sbCheckAgain.setOnCheckedChangeListener { _, _ -> + checkSetting(true) + } } @SingleClick @@ -132,7 +142,8 @@ class LockScreenFragment : BaseFragment, startIndex: Int = 1): Boolean { - if (startIndex >= conditionList.size) { + fun checkCondition(taskId: Long, conditionList: MutableList, beginIndex: Int = 1, endIndex: Int = -1): Boolean { + val untilIndex = if (endIndex == -1) conditionList.size else min(endIndex + 1, conditionList.size) + if (beginIndex >= untilIndex) { Log.d(TAG, "TASK-$taskId:no condition need to check") return true } @@ -46,8 +48,7 @@ class ConditionUtils private constructor() { //注意:触发条件 = SIM卡已准备就绪/网络状态改变时,延迟5秒(给够搜索信号时间)才执行任务 val firstCondition = conditionList.firstOrNull() val needDelay = (firstCondition?.type == TASK_CONDITION_SIM && TaskUtils.simState == 5) || (firstCondition?.type == TASK_CONDITION_NETWORK && TaskUtils.networkState != 0) - - for (i in startIndex until conditionList.size) { + for (i in beginIndex until untilIndex) { //不包括untilIndex val condition = conditionList[i] when (condition.type) { TASK_CONDITION_CRON -> { diff --git a/app/src/main/java/com/idormy/sms/forwarder/workers/ActionWorker.kt b/app/src/main/java/com/idormy/sms/forwarder/workers/ActionWorker.kt index d79766e8..936036ba 100644 --- a/app/src/main/java/com/idormy/sms/forwarder/workers/ActionWorker.kt +++ b/app/src/main/java/com/idormy/sms/forwarder/workers/ActionWorker.kt @@ -45,6 +45,7 @@ import com.idormy.sms.forwarder.utils.TASK_ACTION_SENDER import com.idormy.sms.forwarder.utils.TASK_ACTION_SENDSMS import com.idormy.sms.forwarder.utils.TASK_ACTION_SETTINGS import com.idormy.sms.forwarder.utils.TaskWorker +import com.idormy.sms.forwarder.utils.task.ConditionUtils import com.jeremyliao.liveeventbus.LiveEventBus import com.xuexiang.xrouter.utils.TextUtils import com.xuexiang.xutil.XUtil @@ -61,6 +62,7 @@ class ActionWorker(context: Context, params: WorkerParameters) : CoroutineWorker override suspend fun doWork(): Result { taskId = inputData.getLong(TaskWorker.taskId, -1L) + val taskConditionsJson = inputData.getString(TaskWorker.taskConditions) val taskActionsJson = inputData.getString(TaskWorker.taskActions) val msgInfoJson = inputData.getString(TaskWorker.msgInfo) Log.d(TAG, "taskId: $taskId, taskActionsJson: $taskActionsJson, msgInfoJson: $msgInfoJson") @@ -69,6 +71,19 @@ class ActionWorker(context: Context, params: WorkerParameters) : CoroutineWorker return Result.failure() } + //TODO: 如果传入的taskConditionsJson不为空,需要再次判断触发条件是否满足 + if (!taskConditionsJson.isNullOrEmpty()) { + val conditionList = Gson().fromJson(taskConditionsJson, Array::class.java).toMutableList() + if (conditionList.isEmpty()) { + writeLog("conditionList is empty") + return Result.failure() + } + if (!ConditionUtils.checkCondition(taskId, conditionList, 0, 0)) { + writeLog("recheck condition is not pass", "WARN") + return Result.failure() + } + } + val actionList = Gson().fromJson(taskActionsJson, Array::class.java).toMutableList() if (actionList.isEmpty()) { writeLog("actionList is empty") 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 500d26d7..dfa84dd7 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 @@ -62,21 +62,22 @@ class LockScreenWorker(context: Context, params: WorkerParameters) : CoroutineWo } //TODO: 组装消息体 && 执行具体任务 + val duration = when (action) { + Intent.ACTION_SCREEN_ON -> lockScreenSetting.timeAfterScreenOn * 60000L + Intent.ACTION_SCREEN_OFF -> lockScreenSetting.timeAfterScreenOff * 60000L + Intent.ACTION_USER_PRESENT -> lockScreenSetting.timeAfterScreenUnlocked * 60000L + else -> lockScreenSetting.timeAfterScreenLocked * 60000L + } + Log.d(TAG, "TASK-${task.id}:duration = $duration milliseconds") val msgInfo = MsgInfo("task", task.name, lockScreenSetting.description, Date(), task.description) val actionData = Data.Builder() .putLong(TaskWorker.taskId, task.id) + .putString(TaskWorker.taskConditions, if (lockScreenSetting.checkAgain && duration > 0) task.conditions else "") .putString(TaskWorker.taskActions, task.actions) .putString(TaskWorker.msgInfo, Gson().toJson(msgInfo)) .build() - val duration = when (action) { - Intent.ACTION_SCREEN_ON -> lockScreenSetting.timeAfterScreenOn - Intent.ACTION_SCREEN_OFF -> lockScreenSetting.timeAfterScreenOff - Intent.ACTION_USER_PRESENT -> lockScreenSetting.timeAfterScreenUnlocked - else -> lockScreenSetting.timeAfterScreenLocked - } - Log.d(TAG, "TASK-${task.id}:duration = $duration minutes") val actionRequest = OneTimeWorkRequestBuilder() - .setInitialDelay(duration.toLong(), TimeUnit.MINUTES) + .setInitialDelay(duration, TimeUnit.MILLISECONDS) //TODO: 延迟时间不够精确 .setInputData(actionData).build() WorkManager.getInstance().enqueue(actionRequest) } diff --git a/app/src/main/res/layout/fragment_tasks_condition_lock_screen.xml b/app/src/main/res/layout/fragment_tasks_condition_lock_screen.xml index 54aaeed4..ce1c318e 100644 --- a/app/src/main/res/layout/fragment_tasks_condition_lock_screen.xml +++ b/app/src/main/res/layout/fragment_tasks_condition_lock_screen.xml @@ -162,6 +162,43 @@ + + + + + + + + + + + + + + diff --git a/app/src/main/res/values-en/strings.xml b/app/src/main/res/values-en/strings.xml index 2d788147..c45779cb 100644 --- a/app/src/main/res/values-en/strings.xml +++ b/app/src/main/res/values-en/strings.xml @@ -1196,6 +1196,7 @@ Control enabling/disabling of "Forwarding Rules" Channels On/Off Control enabling/disabling of "Sending Channels" + Alarm Second Minute @@ -1350,4 +1351,6 @@ Chat ID Receive ID Location is not enabled, Please go to system settings and activate it. + Recheck when delaying execution. + When used as a triggering condition, recheck during delayed action execution. diff --git a/app/src/main/res/values-zh-rCN/strings.xml b/app/src/main/res/values-zh-rCN/strings.xml index c1d2682a..c5a67cc5 100644 --- a/app/src/main/res/values-zh-rCN/strings.xml +++ b/app/src/main/res/values-zh-rCN/strings.xml @@ -1197,6 +1197,7 @@ 控制【转发规则】的启用/禁用 启停通道 控制【发送通道】的启用/禁用 + 声音警报 @@ -1351,4 +1352,6 @@ Chat ID 消息接收者ID 位置服务未开启,请先前往系统设置中开启! + 延迟执行时再次校验 + 作为触发条件时,在延迟执行动作时再次校验是否满足 diff --git a/app/src/main/res/values-zh-rTW/strings.xml b/app/src/main/res/values-zh-rTW/strings.xml index 4ca3081b..f103a8e5 100644 --- a/app/src/main/res/values-zh-rTW/strings.xml +++ b/app/src/main/res/values-zh-rTW/strings.xml @@ -1197,6 +1197,7 @@ 控制【轉發規則】的啟用/禁用 啟停通道 控制【發送通道】的啟用/禁用 + 聲音警報 @@ -1352,4 +1353,6 @@ Chat ID 訊息接收者ID 定位服務未開啟,請先前往系統設置中開啟! + 延遲執行時再次校驗 + 作為觸發條件時,在延遲執行動作時再次校驗是否滿足 diff --git a/app/src/main/res/values/strings.xml b/app/src/main/res/values/strings.xml index 10e82cc8..2430ec30 100644 --- a/app/src/main/res/values/strings.xml +++ b/app/src/main/res/values/strings.xml @@ -1197,6 +1197,7 @@ 控制【转发规则】的启用/禁用 启停通道 控制【发送通道】的启用/禁用 + 声音警报 @@ -1351,4 +1352,6 @@ Chat ID 消息接收者ID 位置服务未开启,请先前往系统设置中开启! + 延迟执行时再次校验 + 作为触发条件时,在延迟执行动作时再次校验是否满足