From 5cdbb2be0825cc10860d9189fa5deac05a574c73 Mon Sep 17 00:00:00 2001 From: fiatcode Date: Thu, 30 Apr 2026 11:05:07 +0700 Subject: [PATCH] feat: add HeartbeatScheduler with WorkManager --- .../location/HeartbeatScheduler.kt | 53 +++++++++++++++++++ 1 file changed, 53 insertions(+) create mode 100644 android/app/src/main/kotlin/com/traccar/traccar_client/location/HeartbeatScheduler.kt diff --git a/android/app/src/main/kotlin/com/traccar/traccar_client/location/HeartbeatScheduler.kt b/android/app/src/main/kotlin/com/traccar/traccar_client/location/HeartbeatScheduler.kt new file mode 100644 index 0000000..aa5bd30 --- /dev/null +++ b/android/app/src/main/kotlin/com/traccar/traccar_client/location/HeartbeatScheduler.kt @@ -0,0 +1,53 @@ +package com.traccar.traccar_client.location + +import android.content.Context +import androidx.work.Constraints +import androidx.work.ExistingPeriodicWorkPolicy +import androidx.work.NetworkType +import androidx.work.PeriodicWorkRequestBuilder +import androidx.work.WorkManager +import androidx.work.Worker +import androidx.work.WorkerParameters +import java.util.concurrent.TimeUnit + +class HeartbeatScheduler(private val context: Context) { + + private val workManager = WorkManager.getInstance(context) + + fun scheduleHeartbeat(intervalSeconds: Long, onHeartbeat: () -> Unit) { + val constraints = Constraints.Builder() + .setRequiredNetworkType(NetworkType.NOT_REQUIRED) + .build() + + val heartbeatRequest = PeriodicWorkRequestBuilder( + intervalSeconds, TimeUnit.SECONDS + ) + .setConstraints(constraints) + .addTag(HEARTBEAT_WORK_TAG) + .build() + + workManager.enqueueUniquePeriodicWork( + HEARTBEAT_WORK_NAME, + ExistingPeriodicWorkPolicy.CANCEL_AND_REENQUEUE, + heartbeatRequest + ) + } + + fun cancelHeartbeat() { + workManager.cancelUniqueWork(HEARTBEAT_WORK_NAME) + } + + class HeartbeatWorker( + context: Context, + params: WorkerParameters + ) : Worker(context, params) { + override fun doWork(): Result { + return Result.success() + } + } + + companion object { + const val HEARTBEAT_WORK_TAG = "traccar_heartbeat" + const val HEARTBEAT_WORK_NAME = "traccar_heartbeat_work" + } +}