|
|
|
@ -9,6 +9,7 @@ import androidx.work.WorkManager
|
|
|
|
|
import androidx.work.WorkerParameters
|
|
|
|
|
import com.google.gson.Gson
|
|
|
|
|
import com.idormy.sms.forwarder.App
|
|
|
|
|
import com.idormy.sms.forwarder.R
|
|
|
|
|
import com.idormy.sms.forwarder.database.AppDatabase
|
|
|
|
|
import com.idormy.sms.forwarder.entity.LocationInfo
|
|
|
|
|
import com.idormy.sms.forwarder.entity.MsgInfo
|
|
|
|
@ -17,6 +18,8 @@ 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.Companion.calculateDistance
|
|
|
|
|
import com.xuexiang.xutil.resource.ResUtils.getString
|
|
|
|
|
import java.util.Date
|
|
|
|
|
|
|
|
|
|
@Suppress("PrivatePropertyName", "DEPRECATION")
|
|
|
|
@ -26,22 +29,24 @@ class LocationWorker(context: Context, params: WorkerParameters) : CoroutineWork
|
|
|
|
|
|
|
|
|
|
override suspend fun doWork(): Result {
|
|
|
|
|
|
|
|
|
|
Log.d(TAG, "doWork")
|
|
|
|
|
val locationInfoJsonOld = inputData.getString("locationInfoJsonOld")
|
|
|
|
|
val locationInfoJsonNew = inputData.getString("locationInfoJsonNew")
|
|
|
|
|
if (locationInfoJsonOld == null || locationInfoJsonNew == null) {
|
|
|
|
|
val conditionType = inputData.getInt(TaskWorker.conditionType, -1)
|
|
|
|
|
val locationJsonOld = inputData.getString("locationJsonOld")
|
|
|
|
|
val locationJsonNew = inputData.getString("locationJsonNew")
|
|
|
|
|
Log.d(TAG, "conditionType = $conditionType, locationJsonOld = $locationJsonOld, locationJsonNew = $locationJsonNew")
|
|
|
|
|
|
|
|
|
|
if (locationJsonOld == null || locationJsonNew == null) {
|
|
|
|
|
Log.d(TAG, "locationInfoOld or locationInfoNew is null")
|
|
|
|
|
return Result.failure()
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
val locationInfoOld = Gson().fromJson(locationInfoJsonOld, LocationInfo::class.java)
|
|
|
|
|
val locationInfoNew = Gson().fromJson(locationInfoJsonNew, LocationInfo::class.java)
|
|
|
|
|
if (locationInfoOld == null || locationInfoNew == null) {
|
|
|
|
|
val locationOld = Gson().fromJson(locationJsonOld, LocationInfo::class.java)
|
|
|
|
|
val locationNew = Gson().fromJson(locationJsonNew, LocationInfo::class.java)
|
|
|
|
|
if (locationOld == null || locationNew == null) {
|
|
|
|
|
Log.d(TAG, "locationInfoOld or locationInfoNew is null")
|
|
|
|
|
return Result.failure()
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
when (val conditionType = inputData.getInt(TaskWorker.conditionType, -1)) {
|
|
|
|
|
when (conditionType) {
|
|
|
|
|
|
|
|
|
|
//到达地点
|
|
|
|
|
TASK_CONDITION_TO_ADDRESS -> {
|
|
|
|
@ -52,26 +57,46 @@ class LocationWorker(context: Context, params: WorkerParameters) : CoroutineWork
|
|
|
|
|
// 根据任务信息执行相应操作
|
|
|
|
|
val conditionList = Gson().fromJson(task.conditions, Array<TaskSetting>::class.java).toMutableList()
|
|
|
|
|
if (conditionList.isEmpty()) {
|
|
|
|
|
Log.d(TAG, "任务${task.id}:conditionList is empty")
|
|
|
|
|
Log.d(TAG, "TASK-${task.id}:conditionList is empty")
|
|
|
|
|
continue
|
|
|
|
|
}
|
|
|
|
|
val firstCondition = conditionList.firstOrNull()
|
|
|
|
|
if (firstCondition == null) {
|
|
|
|
|
Log.d(TAG, "任务${task.id}:firstCondition is null")
|
|
|
|
|
Log.d(TAG, "TASK-${task.id}:firstCondition is null")
|
|
|
|
|
continue
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
val locationSetting = Gson().fromJson(firstCondition.setting, LocationSetting::class.java)
|
|
|
|
|
if (locationSetting == null) {
|
|
|
|
|
Log.d(TAG, "任务${task.id}:locationSetting is null")
|
|
|
|
|
Log.d(TAG, "TASK-${task.id}:locationSetting is null")
|
|
|
|
|
continue
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
//TODO:判断条件是否满足
|
|
|
|
|
var description = locationSetting.description
|
|
|
|
|
val isMatchCondition = when (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)
|
|
|
|
|
Log.d(TAG, "TASK-${task.id}:distanceOld = $distanceOld, distanceNew = $distanceNew")
|
|
|
|
|
description += String.format(getString(R.string.current_distance_from_center), String.format("%.2f", distanceNew))
|
|
|
|
|
distanceOld > locationSetting.distance && distanceNew <= locationSetting.distance
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
"address" -> {
|
|
|
|
|
!locationOld.address.contains(locationSetting.address) && locationNew.address.contains(locationSetting.address)
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
else -> false
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
if (!isMatchCondition) {
|
|
|
|
|
Log.d(TAG, "TASK-${task.id}:isMatchCondition = false")
|
|
|
|
|
continue
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
//TODO: 组装消息体 && 执行具体任务
|
|
|
|
|
val msg = locationInfoNew.toString()
|
|
|
|
|
val msgInfo = MsgInfo("task", task.name, msg, Date(), task.name)
|
|
|
|
|
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()
|
|
|
|
|
val actionRequest = OneTimeWorkRequestBuilder<ActionWorker>().setInputData(actionData).build()
|
|
|
|
|
WorkManager.getInstance().enqueue(actionRequest)
|
|
|
|
@ -89,26 +114,46 @@ class LocationWorker(context: Context, params: WorkerParameters) : CoroutineWork
|
|
|
|
|
// 根据任务信息执行相应操作
|
|
|
|
|
val conditionList = Gson().fromJson(task.conditions, Array<TaskSetting>::class.java).toMutableList()
|
|
|
|
|
if (conditionList.isEmpty()) {
|
|
|
|
|
Log.d(TAG, "任务${task.id}:conditionList is empty")
|
|
|
|
|
Log.d(TAG, "TASK-${task.id}:conditionList is empty")
|
|
|
|
|
continue
|
|
|
|
|
}
|
|
|
|
|
val firstCondition = conditionList.firstOrNull()
|
|
|
|
|
if (firstCondition == null) {
|
|
|
|
|
Log.d(TAG, "任务${task.id}:firstCondition is null")
|
|
|
|
|
Log.d(TAG, "TASK-${task.id}:firstCondition is null")
|
|
|
|
|
continue
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
val locationSetting = Gson().fromJson(firstCondition.setting, LocationSetting::class.java)
|
|
|
|
|
if (locationSetting == null) {
|
|
|
|
|
Log.d(TAG, "任务${task.id}:locationSetting is null")
|
|
|
|
|
Log.d(TAG, "TASK-${task.id}:locationSetting is null")
|
|
|
|
|
continue
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
//TODO:判断条件是否满足
|
|
|
|
|
var description = locationSetting.description
|
|
|
|
|
val isMatchCondition = when (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)
|
|
|
|
|
Log.d(TAG, "TASK-${task.id}:distanceOld = $distanceOld, distanceNew = $distanceNew")
|
|
|
|
|
description += String.format(getString(R.string.current_distance_from_center), String.format("%.2f", distanceNew))
|
|
|
|
|
distanceOld <= locationSetting.distance && distanceNew > locationSetting.distance
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
"address" -> {
|
|
|
|
|
locationOld.address.contains(locationSetting.address) && !locationNew.address.contains(locationSetting.address)
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
else -> false
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
if (!isMatchCondition) {
|
|
|
|
|
Log.d(TAG, "TASK-${task.id}:isMatchCondition = false")
|
|
|
|
|
continue
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
//TODO: 组装消息体 && 执行具体任务
|
|
|
|
|
val msg = locationInfoNew.toString()
|
|
|
|
|
val msgInfo = MsgInfo("task", task.name, msg, Date(), task.description)
|
|
|
|
|
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()
|
|
|
|
|
val actionRequest = OneTimeWorkRequestBuilder<ActionWorker>().setInputData(actionData).build()
|
|
|
|
|
WorkManager.getInstance().enqueue(actionRequest)
|
|
|
|
|