diff --git a/app/src/main/java/com/idormy/sms/forwarder/App.kt b/app/src/main/java/com/idormy/sms/forwarder/App.kt index 85806093..29ffb01f 100644 --- a/app/src/main/java/com/idormy/sms/forwarder/App.kt +++ b/app/src/main/java/com/idormy/sms/forwarder/App.kt @@ -88,6 +88,7 @@ class App : Application(), CactusCallback, Configuration.Provider by Core { val LocationClient by lazy { LocationClient(context) } val Geocoder by lazy { Geocoder(context) } val DateFormat by lazy { SimpleDateFormat("yyyy-MM-dd HH:mm:ss", Locale.getDefault()) } + val GeofenceStatusMap = mutableMapOf() //是否已进入/离开围栏 } override fun attachBaseContext(base: Context) { diff --git a/app/src/main/java/com/idormy/sms/forwarder/adapter/TaskPagingAdapter.kt b/app/src/main/java/com/idormy/sms/forwarder/adapter/TaskPagingAdapter.kt index ff091701..c77ebe33 100644 --- a/app/src/main/java/com/idormy/sms/forwarder/adapter/TaskPagingAdapter.kt +++ b/app/src/main/java/com/idormy/sms/forwarder/adapter/TaskPagingAdapter.kt @@ -72,6 +72,12 @@ class TaskPagingAdapter(private val itemClickListener: OnItemClickListener) : Pa holder.binding.ivDelete.setOnClickListener { view: View? -> itemClickListener.onItemClicked(view, item) } + + holder.binding.sbEnableTask.isChecked = item.status == 1 + holder.binding.sbEnableTask.setOnCheckedChangeListener { view: View, isChecked -> + item.status = if (isChecked) 1 else 0 + itemClickListener.onItemClicked(view, item) + } } else { holder.binding.layoutImage.visibility = View.VISIBLE holder.binding.layoutIcons.visibility = View.GONE @@ -83,6 +89,7 @@ class TaskPagingAdapter(private val itemClickListener: OnItemClickListener) : Pa holder.binding.ivStatus.setImageResource(item.statusImageId) holder.binding.ivEdit.visibility = View.GONE holder.binding.ivDelete.visibility = View.GONE + holder.binding.sbEnableTask.visibility = View.GONE } holder.binding.tvName.text = item.name holder.binding.tvDescription.text = item.description diff --git a/app/src/main/java/com/idormy/sms/forwarder/database/dao/TaskDao.kt b/app/src/main/java/com/idormy/sms/forwarder/database/dao/TaskDao.kt index 68f64c92..8ba3d8a4 100644 --- a/app/src/main/java/com/idormy/sms/forwarder/database/dao/TaskDao.kt +++ b/app/src/main/java/com/idormy/sms/forwarder/database/dao/TaskDao.kt @@ -59,4 +59,7 @@ interface TaskDao { @Query("DELETE FROM Task") fun deleteAll() + @Query("UPDATE Task SET status = :status WHERE id = :id") + fun updateStatus(id: Long, status: Int) + } diff --git a/app/src/main/java/com/idormy/sms/forwarder/database/viewmodel/TaskViewModel.kt b/app/src/main/java/com/idormy/sms/forwarder/database/viewmodel/TaskViewModel.kt index dc1e115d..519050aa 100644 --- a/app/src/main/java/com/idormy/sms/forwarder/database/viewmodel/TaskViewModel.kt +++ b/app/src/main/java/com/idormy/sms/forwarder/database/viewmodel/TaskViewModel.kt @@ -38,4 +38,8 @@ class TaskViewModel(private val dao: TaskDao) : ViewModel() { fun delete(id: Long) = ioThread { dao.delete(id) } + + fun updateStatus(id: Long, status: Int) = ioThread { + dao.updateStatus(id, status) + } } \ No newline at end of file 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 e1f33af0..9b9b80d7 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 @@ -25,9 +25,7 @@ data class LocationSetting( } } - fun calculateDistance( - lat1: Double, lon1: Double, lat2: Double, lon2: Double - ): Double { + fun calculateDistance(lat1: Double, lon1: Double, lat2: Double, lon2: Double): Double { val earthRadius = 6371000.0 // 地球平均半径,单位:米 val latDistance = Math.toRadians(lat2 - lat1) val lonDistance = Math.toRadians(lon2 - lon1) diff --git a/app/src/main/java/com/idormy/sms/forwarder/fragment/TasksEditFragment.kt b/app/src/main/java/com/idormy/sms/forwarder/fragment/TasksEditFragment.kt index b12ec106..3d195205 100644 --- a/app/src/main/java/com/idormy/sms/forwarder/fragment/TasksEditFragment.kt +++ b/app/src/main/java/com/idormy/sms/forwarder/fragment/TasksEditFragment.kt @@ -13,6 +13,7 @@ import androidx.recyclerview.widget.LinearLayoutManager import androidx.recyclerview.widget.RecyclerView import com.google.android.material.bottomsheet.BottomSheetDialog import com.google.gson.Gson +import com.idormy.sms.forwarder.App import com.idormy.sms.forwarder.R import com.idormy.sms.forwarder.adapter.ItemMoveCallback import com.idormy.sms.forwarder.adapter.TaskSettingAdapter @@ -25,6 +26,7 @@ import com.idormy.sms.forwarder.database.viewmodel.TaskViewModel import com.idormy.sms.forwarder.databinding.FragmentTasksEditBinding import com.idormy.sms.forwarder.entity.task.CronSetting import com.idormy.sms.forwarder.entity.task.TaskSetting +import com.idormy.sms.forwarder.service.LocationService import com.idormy.sms.forwarder.utils.* import com.idormy.sms.forwarder.utils.task.CronJobScheduler import com.xuexiang.xaop.annotation.SingleClick @@ -39,6 +41,8 @@ import com.xuexiang.xui.utils.DensityUtils import com.xuexiang.xui.utils.WidgetUtils import com.xuexiang.xui.widget.actionbar.TitleBar import com.xuexiang.xui.widget.alpha.XUIAlphaTextView +import com.xuexiang.xui.widget.dialog.materialdialog.DialogAction +import com.xuexiang.xui.widget.dialog.materialdialog.MaterialDialog import gatewayapps.crondroid.CronExpression import io.reactivex.SingleObserver import io.reactivex.android.schedulers.AndroidSchedulers @@ -363,6 +367,25 @@ class TasksEditFragment : BaseFragment(), View.OnClic XToastUtils.error(getString(R.string.condition_already_exists)) return } + + //必须开启定位服务,才能使用进入地点 或 离开地址 类型条件 + if ((typeCondition == TASK_CONDITION_TO_ADDRESS || typeCondition == TASK_CONDITION_LEAVE_ADDRESS) && !App.LocationClient.isStarted()) { + MaterialDialog.Builder(requireContext()) + .iconRes(R.drawable.auto_task_icon_location) + .title(R.string.enable_location) + .content(R.string.enable_location_dialog) + .cancelable(false) + .positiveText(R.string.lab_yes) + .negativeText(R.string.lab_no).onPositive { _: MaterialDialog?, _: DialogAction? -> + SettingUtils.enableLocation = true + val serviceIntent = Intent(requireContext(), LocationService::class.java) + serviceIntent.action = "START" + requireContext().startService(serviceIntent) + }.show() + return + } + + //进入地点 或 离开地址 类型条件互斥 if ((typeCondition == TASK_CONDITION_TO_ADDRESS || typeCondition == TASK_CONDITION_LEAVE_ADDRESS) && (item.type == TASK_CONDITION_TO_ADDRESS || item.type == TASK_CONDITION_LEAVE_ADDRESS)) { XToastUtils.error(getString(R.string.only_one_location_condition)) return diff --git a/app/src/main/java/com/idormy/sms/forwarder/fragment/TasksFragment.kt b/app/src/main/java/com/idormy/sms/forwarder/fragment/TasksFragment.kt index 5dde4eb1..e44a1d49 100644 --- a/app/src/main/java/com/idormy/sms/forwarder/fragment/TasksFragment.kt +++ b/app/src/main/java/com/idormy/sms/forwarder/fragment/TasksFragment.kt @@ -104,6 +104,10 @@ class TasksFragment : BaseFragment(), TaskPagingAdapter.O override fun onItemClicked(view: View?, item: Task) { when (view?.id) { + R.id.sb_enable_task -> { + viewModel.updateStatus(item.id, item.status) + } + R.id.iv_copy -> { PageOption.to(TasksEditFragment::class.java) .setNewActivity(true).putLong(KEY_TASK_ID, item.id) diff --git a/app/src/main/java/com/idormy/sms/forwarder/fragment/condition/LeaveAddressFragment.kt b/app/src/main/java/com/idormy/sms/forwarder/fragment/condition/LeaveAddressFragment.kt index a1d471a0..a0386889 100644 --- a/app/src/main/java/com/idormy/sms/forwarder/fragment/condition/LeaveAddressFragment.kt +++ b/app/src/main/java/com/idormy/sms/forwarder/fragment/condition/LeaveAddressFragment.kt @@ -7,14 +7,18 @@ import android.view.LayoutInflater import android.view.View import android.view.ViewGroup import com.google.gson.Gson +import com.idormy.sms.forwarder.App import com.idormy.sms.forwarder.R import com.idormy.sms.forwarder.core.BaseFragment import com.idormy.sms.forwarder.databinding.FragmentTasksConditionLeaveAddressBinding import com.idormy.sms.forwarder.entity.task.LocationSetting +import com.idormy.sms.forwarder.service.LocationService +import com.idormy.sms.forwarder.utils.HttpServerUtils 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.SettingUtils import com.idormy.sms.forwarder.utils.TASK_CONDITION_LEAVE_ADDRESS import com.idormy.sms.forwarder.utils.XToastUtils import com.jeremyliao.liveeventbus.LiveEventBus @@ -24,6 +28,8 @@ 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 +import com.xuexiang.xui.widget.dialog.materialdialog.DialogAction +import com.xuexiang.xui.widget.dialog.materialdialog.MaterialDialog @Page(name = "LeaveAddress") @Suppress("PrivatePropertyName") @@ -98,6 +104,7 @@ class LeaveAddressFragment : BaseFragment { + if (!App.LocationClient.isStarted()) { + MaterialDialog.Builder(requireContext()) + .iconRes(R.drawable.auto_task_icon_location) + .title(R.string.enable_location) + .content(R.string.enable_location_dialog) + .cancelable(false) + .positiveText(R.string.lab_yes) + .negativeText(R.string.lab_no).onPositive { _: MaterialDialog?, _: DialogAction? -> + SettingUtils.enableLocation = true + val serviceIntent = Intent(requireContext(), LocationService::class.java) + serviceIntent.action = "START" + requireContext().startService(serviceIntent) + }.show() + return + } + + val location = HttpServerUtils.apiLocationCache + if (location.latitude == 0.0 || location.longitude == 0.0) { + XToastUtils.error(getString(R.string.location_failed), 30000) + return + } + + binding!!.etLatitude.setText(location.latitude.toString()) + binding!!.etLongitude.setText(location.longitude.toString()) + XToastUtils.success(String.format(getString(R.string.current_address), location.address), 30000) + } + R.id.btn_test -> { mCountDownHelper?.start() Thread { diff --git a/app/src/main/java/com/idormy/sms/forwarder/fragment/condition/ToAddressFragment.kt b/app/src/main/java/com/idormy/sms/forwarder/fragment/condition/ToAddressFragment.kt index 98691348..988aa855 100644 --- a/app/src/main/java/com/idormy/sms/forwarder/fragment/condition/ToAddressFragment.kt +++ b/app/src/main/java/com/idormy/sms/forwarder/fragment/condition/ToAddressFragment.kt @@ -7,14 +7,18 @@ import android.view.LayoutInflater import android.view.View import android.view.ViewGroup import com.google.gson.Gson +import com.idormy.sms.forwarder.App import com.idormy.sms.forwarder.R import com.idormy.sms.forwarder.core.BaseFragment import com.idormy.sms.forwarder.databinding.FragmentTasksConditionToAddressBinding import com.idormy.sms.forwarder.entity.task.LocationSetting +import com.idormy.sms.forwarder.service.LocationService +import com.idormy.sms.forwarder.utils.HttpServerUtils 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.SettingUtils import com.idormy.sms.forwarder.utils.TASK_CONDITION_TO_ADDRESS import com.idormy.sms.forwarder.utils.XToastUtils import com.jeremyliao.liveeventbus.LiveEventBus @@ -24,6 +28,8 @@ 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 +import com.xuexiang.xui.widget.dialog.materialdialog.DialogAction +import com.xuexiang.xui.widget.dialog.materialdialog.MaterialDialog @Page(name = "ToAddress") @Suppress("PrivatePropertyName") @@ -98,6 +104,7 @@ class ToAddressFragment : BaseFragment( binding!!.btnTest.setOnClickListener(this) binding!!.btnDel.setOnClickListener(this) binding!!.btnSave.setOnClickListener(this) + binding!!.btnCurrentCoordinates.setOnClickListener(this) LiveEventBus.get(KEY_TEST_CONDITION, String::class.java).observe(this) { mCountDownHelper?.finish() @@ -113,6 +120,34 @@ class ToAddressFragment : BaseFragment( override fun onClick(v: View) { try { when (v.id) { + R.id.btn_current_coordinates -> { + if (!App.LocationClient.isStarted()) { + MaterialDialog.Builder(requireContext()) + .iconRes(R.drawable.auto_task_icon_location) + .title(R.string.enable_location) + .content(R.string.enable_location_dialog) + .cancelable(false) + .positiveText(R.string.lab_yes) + .negativeText(R.string.lab_no).onPositive { _: MaterialDialog?, _: DialogAction? -> + SettingUtils.enableLocation = true + val serviceIntent = Intent(requireContext(), LocationService::class.java) + serviceIntent.action = "START" + requireContext().startService(serviceIntent) + }.show() + return + } + + val location = HttpServerUtils.apiLocationCache + if (location.latitude == 0.0 || location.longitude == 0.0) { + XToastUtils.error(getString(R.string.location_failed), 30000) + return + } + + binding!!.etLatitude.setText(location.latitude.toString()) + binding!!.etLongitude.setText(location.longitude.toString()) + XToastUtils.success(String.format(getString(R.string.current_address), location.address), 30000) + } + R.id.btn_test -> { mCountDownHelper?.start() Thread { 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 c85183f3..71f01df9 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 @@ -6,10 +6,19 @@ import android.content.Intent import android.location.Location import android.os.IBinder import android.util.Log +import androidx.work.OneTimeWorkRequestBuilder +import androidx.work.WorkManager +import androidx.work.workDataOf +import com.google.gson.Gson import com.idormy.sms.forwarder.App import com.idormy.sms.forwarder.entity.LocationInfo import com.idormy.sms.forwarder.utils.HttpServerUtils import com.idormy.sms.forwarder.utils.SettingUtils +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.TaskUtils +import com.idormy.sms.forwarder.workers.LocationWorker import com.king.location.LocationErrorCode import com.king.location.OnExceptionListener import com.king.location.OnLocationListener @@ -97,20 +106,44 @@ class LocationService : Service(), Server.ServerListener { //位置信息 Log.d(TAG, "onLocationChanged(location = ${location})") - val locationInfo = LocationInfo( + val locationInfoNew = LocationInfo( location.longitude, location.latitude, "", App.DateFormat.format(Date(location.time)), location.provider.toString() ) //根据坐标经纬度获取位置地址信息(WGS-84坐标系) val list = App.Geocoder.getFromLocation(location.latitude, location.longitude, 1) if (list?.isNotEmpty() == true) { - locationInfo.address = list[0].getAddressLine(0) + locationInfoNew.address = list[0].getAddressLine(0) } - Log.d(TAG, "locationInfo = $locationInfo") - HttpServerUtils.apiLocationCache = locationInfo + Log.d(TAG, "locationInfoNew = $locationInfoNew") + HttpServerUtils.apiLocationCache = locationInfoNew //TODO: 触发自动任务 + val locationInfoOld = TaskUtils.lastLocationInfo + TaskUtils.lastLocationInfo = locationInfoNew + if (locationInfoOld.longitude != locationInfoNew.longitude || locationInfoOld.latitude != locationInfoNew.latitude || locationInfoOld.address != locationInfoNew.address) { + Log.d(TAG, "locationInfoOld = $locationInfoOld") + + val locationInfoJsonOld = Gson().toJson(locationInfoOld) + val locationInfoJsonNew = Gson().toJson(locationInfoNew) + val toAddressRequest = OneTimeWorkRequestBuilder().setInputData( + workDataOf( + TaskWorker.conditionType to TASK_CONDITION_TO_ADDRESS, + "locationInfoJsonOld" to locationInfoJsonOld, + "locationInfoJsonNew" to locationInfoJsonNew, + ) + ).build() + WorkManager.getInstance(applicationContext).enqueue(toAddressRequest) + val leaveAddressRequest = OneTimeWorkRequestBuilder().setInputData( + workDataOf( + TaskWorker.conditionType to TASK_CONDITION_LEAVE_ADDRESS, + "locationInfoJsonOld" to locationInfoJsonNew, + "locationInfoJsonNew" to locationInfoJsonOld, + ) + ).build() + WorkManager.getInstance(applicationContext).enqueue(leaveAddressRequest) + } } override fun onProviderEnabled(provider: String) { 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 7ca461ae..d7d02a81 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 @@ -2,6 +2,7 @@ package com.idormy.sms.forwarder.utils.task import android.os.BatteryManager import com.idormy.sms.forwarder.R +import com.idormy.sms.forwarder.entity.LocationInfo import com.idormy.sms.forwarder.utils.SP_BATTERY_INFO import com.idormy.sms.forwarder.utils.SP_BATTERY_LEVEL import com.idormy.sms.forwarder.utils.SP_BATTERY_PCT @@ -104,5 +105,9 @@ class TaskUtils private constructor() { //SIM卡状态:0-未知状态,1-卡被移除,5-卡已准备就绪 var simState: Int by SharedPreference(SP_SIM_STATE, 0) + + //上次定位信息 + var lastLocationInfo: LocationInfo by SharedPreference("lastLocationInfo", LocationInfo()) + } } \ No newline at end of file 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 f3a1a3b5..9f205c88 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 @@ -10,14 +10,13 @@ import androidx.work.WorkerParameters import com.google.gson.Gson import com.idormy.sms.forwarder.App import com.idormy.sms.forwarder.database.AppDatabase +import com.idormy.sms.forwarder.entity.LocationInfo import com.idormy.sms.forwarder.entity.MsgInfo -import com.idormy.sms.forwarder.entity.task.BatterySetting -import com.idormy.sms.forwarder.entity.task.ChargeSetting +import com.idormy.sms.forwarder.entity.task.LocationSetting 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.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.TaskUtils import java.util.Date @Suppress("PrivatePropertyName", "DEPRECATION") @@ -27,18 +26,25 @@ 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) { + 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) { + Log.d(TAG, "locationInfoOld or locationInfoNew is null") + return Result.failure() + } + when (val conditionType = inputData.getInt(TaskWorker.conditionType, -1)) { - TASK_CONDITION_BATTERY -> { - val status = inputData.getInt("status", -1) - val levelNew = inputData.getInt("level_new", -1) - val levelOld = inputData.getInt("level_old", -1) - Log.d(TAG, "levelNew: $levelNew, levelOld: $levelOld") - if (levelNew == -1 || levelOld == -1) { - Log.d(TAG, "levelNew or levelOld is -1") - return Result.failure() - } - + //到达地点 + TASK_CONDITION_TO_ADDRESS -> { val taskList = AppDatabase.getInstance(App.context).taskDao().getByType(conditionType) for (task in taskList) { Log.d(TAG, "task = $task") @@ -55,27 +61,18 @@ class LocationWorker(context: Context, params: WorkerParameters) : CoroutineWork continue } - val batterySetting = Gson().fromJson(firstCondition.setting, BatterySetting::class.java) - if (batterySetting == null) { - Log.d(TAG, "任务${task.id}:batterySetting is null") + val locationSetting = Gson().fromJson(firstCondition.setting, LocationSetting::class.java) + if (locationSetting == null) { + Log.d(TAG, "任务${task.id}:locationSetting is null") continue } - val msg = batterySetting.getMsg(status, levelNew, levelOld, TaskUtils.batteryInfo) - if (msg.isEmpty()) { - Log.d(TAG, "任务${task.id}:msg is empty, batterySetting = $batterySetting, status = $status, levelNew = $levelNew, levelOld = $levelOld") - continue - } - - //TODO:判断其他条件是否满足 + //TODO:判断条件是否满足 //TODO: 组装消息体 && 执行具体任务 + val msg = locationInfoNew.toString() val msgInfo = MsgInfo("task", task.name, msg, 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) } @@ -83,17 +80,8 @@ class LocationWorker(context: Context, params: WorkerParameters) : CoroutineWork return Result.success() } - TASK_CONDITION_CHARGE -> { - val statusNew = inputData.getInt("status_new", -1) - val statusOld = inputData.getInt("status_old", -1) - val pluggedNew = inputData.getInt("plugged_new", -1) - val pluggedOld = inputData.getInt("plugged_old", -1) - Log.d(TAG, "statusNew: $statusNew, statusOld: $statusOld, pluggedNew: $pluggedNew, pluggedOld: $pluggedOld") - if (statusNew == -1 || statusOld == -1 || pluggedNew == -1 || pluggedOld == -1) { - Log.d(TAG, "statusNew or statusOld or pluggedNew or pluggedOld is -1") - return Result.failure() - } - + //离开地点 + TASK_CONDITION_LEAVE_ADDRESS -> { val taskList = AppDatabase.getInstance(App.context).taskDao().getByType(conditionType) for (task in taskList) { Log.d(TAG, "task = $task") @@ -110,27 +98,18 @@ class LocationWorker(context: Context, params: WorkerParameters) : CoroutineWork continue } - val chargeSetting = Gson().fromJson(firstCondition.setting, ChargeSetting::class.java) - if (chargeSetting == null) { - Log.d(TAG, "任务${task.id}:chargeSetting is null") + val locationSetting = Gson().fromJson(firstCondition.setting, LocationSetting::class.java) + if (locationSetting == null) { + Log.d(TAG, "任务${task.id}:locationSetting is null") continue } - val msg = chargeSetting.getMsg(statusNew, statusOld, pluggedNew, pluggedOld, TaskUtils.batteryInfo) - if (msg.isEmpty()) { - Log.d(TAG, "任务${task.id}:msg is empty, chargeSetting = $chargeSetting, statusNew = $statusNew, statusOld = $statusOld, pluggedNew = $pluggedNew, pluggedOld = $pluggedOld") - continue - } - - //TODO:判断其他条件是否满足 + //TODO:判断条件是否满足 //TODO: 组装消息体 && 执行具体任务 + val msg = locationInfoNew.toString() val msgInfo = MsgInfo("task", task.name, msg, Date(), task.description) - 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/res/layout/adapter_tasks_card_view_list_item.xml b/app/src/main/res/layout/adapter_tasks_card_view_list_item.xml index b44ec60c..7870f5b6 100644 --- a/app/src/main/res/layout/adapter_tasks_card_view_list_item.xml +++ b/app/src/main/res/layout/adapter_tasks_card_view_list_item.xml @@ -44,11 +44,13 @@ android:layout_weight="1" android:orientation="horizontal" /> - + android:paddingTop="@dimen/config_padding_5dp" + android:paddingBottom="@dimen/config_padding_5dp" + tools:ignore="TouchTargetSizeCheck" /> @@ -56,7 +58,8 @@ android:layout_width="match_parent" android:layout_height="wrap_content" android:gravity="center_vertical" - android:orientation="horizontal"> + android:orientation="horizontal" + tools:ignore="DisableBaselineAlignment"> - + - + - + + + + + + + + + + + + \ No newline at end of file diff --git a/app/src/main/res/layout/fragment_settings.xml b/app/src/main/res/layout/fragment_settings.xml index 1e4a6db4..3698e046 100644 --- a/app/src/main/res/layout/fragment_settings.xml +++ b/app/src/main/res/layout/fragment_settings.xml @@ -524,7 +524,7 @@ android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_marginStart="5dp" - android:text="@string/seconds" + android:text="@string/meter" android:textSize="12sp" android:textStyle="bold" /> diff --git a/app/src/main/res/values-en/strings.xml b/app/src/main/res/values-en/strings.xml index 5eaf7eb6..bae1b5ba 100644 --- a/app/src/main/res/values-en/strings.xml +++ b/app/src/main/res/values-en/strings.xml @@ -1087,6 +1087,7 @@ IPv6 Enable Location Function + Enable location services to use this feature. Yes or No? Used for locating the phone, {{LOCATION}} tag. Accuracy Fine @@ -1096,7 +1097,7 @@ Low Medium High - Min Interval For Update + To Update: Min Interval Min Distance m UID @@ -1241,4 +1242,6 @@ This type of condition already exists. This type of action already exists. Only one condition, either "To Address" or "Leave Address" can be added. + Current Address: %s + Location failed. Please try again later. diff --git a/app/src/main/res/values/strings.xml b/app/src/main/res/values/strings.xml index 1bd0e78a..acb82698 100644 --- a/app/src/main/res/values/strings.xml +++ b/app/src/main/res/values/strings.xml @@ -1088,6 +1088,7 @@ IPv6 启用GPS定位功能 + 必须开启定位服务,才能使用获取!\n是否立即启用? 用于支持 查找手机、{{定位信息}}标签 功能 位置精度 精确位置 @@ -1097,7 +1098,7 @@ - 位置更新最小间隔 + 位置更新:最小间隔 最小距离 UID @@ -1235,11 +1236,13 @@ 则表示离开 经纬度或距离都不能为空 地址关键字不能为空 - 进入以经度:%s,维度:%s 为中心,%s 米半径的区域 - 进入GPS地址包含 %s 关键字区域 - 离开以经度:%s,维度:%s 为中心,%s 米半径的区域 - 离开GPS地址包含 %s 关键字区域 + 进入以经度:%s,维度:%s为中心,%s米半径的区域 + 进入GPS地址包含[%s]关键字区域 + 离开以经度:%s,维度:%s为中心,%s米半径的区域 + 离开GPS地址包含[%s]关键字区域 已经添加过该类型条件 已经添加过该类型动作 只能添加一个 进入地点 或 离开地址 类型条件 + 当前地址:%s + 定位失败,请稍后重试