Self-hosted, federated location sharing app and server that prioritizes user privacy and security
end-to-end-encryption location-sharing privacy self-hosted federated

Add WorkManager periodic background worker with location scheduler

azom.dev aba825cf 36f2eb0e

verified
+72
+1
app/src-tauri/gen/android/app/build.gradle.kts
··· 62 62 implementation("androidx.appcompat:appcompat:1.7.1") 63 63 implementation("androidx.activity:activity-ktx:1.10.1") 64 64 implementation("com.google.android.material:material:1.12.0") 65 + implementation("androidx.work:work-runtime-ktx:2.10.1") 65 66 testImplementation("junit:junit:4.13.2") 66 67 androidTestImplementation("androidx.test.ext:junit:1.1.4") 67 68 androidTestImplementation("androidx.test.espresso:espresso-core:3.5.0")
+33
app/src-tauri/gen/android/app/src/main/java/dev/azom/privacypin/LocationScheduler.kt
··· 1 + package dev.azom.privacypin 2 + 3 + import android.content.Context 4 + import android.util.Log 5 + import androidx.work.ExistingPeriodicWorkPolicy 6 + import androidx.work.PeriodicWorkRequestBuilder 7 + import androidx.work.WorkManager 8 + import java.util.concurrent.TimeUnit 9 + 10 + object LocationScheduler { 11 + 12 + fun start(context: Context) { 13 + Log.i(LocationWorker.TAG, "Scheduling periodic location work") 14 + 15 + val workRequest = PeriodicWorkRequestBuilder<LocationWorker>( 16 + 15, TimeUnit.MINUTES, 17 + ).build() 18 + 19 + WorkManager.getInstance(context).enqueueUniquePeriodicWork( 20 + LocationWorker.WORK_NAME, 21 + ExistingPeriodicWorkPolicy.KEEP, 22 + workRequest, 23 + ) 24 + 25 + Log.i(LocationWorker.TAG, "Periodic location work scheduled (every 15 min)") 26 + } 27 + 28 + fun stop(context: Context) { 29 + Log.i(LocationWorker.TAG, "Cancelling periodic location work") 30 + WorkManager.getInstance(context).cancelUniqueWork(LocationWorker.WORK_NAME) 31 + Log.i(LocationWorker.TAG, "Periodic location work cancelled") 32 + } 33 + }
+35
app/src-tauri/gen/android/app/src/main/java/dev/azom/privacypin/LocationWorker.kt
··· 1 + package dev.azom.privacypin 2 + 3 + import android.content.Context 4 + import android.util.Log 5 + import androidx.work.CoroutineWorker 6 + import androidx.work.WorkerParameters 7 + import java.time.Instant 8 + import java.time.ZoneId 9 + import java.time.format.DateTimeFormatter 10 + 11 + class LocationWorker( 12 + appContext: Context, 13 + workerParams: WorkerParameters, 14 + ) : CoroutineWorker(appContext, workerParams) { 15 + 16 + companion object { 17 + const val TAG = "PrivacyPin" 18 + const val WORK_NAME = "privacypin_location_work" 19 + } 20 + 21 + override suspend fun doWork(): Result { 22 + val now = Instant.now() 23 + .atZone(ZoneId.systemDefault()) 24 + .format(DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss")) 25 + 26 + Log.i(TAG, "LocationWorker executed at $now (attempt #$runAttemptCount)") 27 + 28 + // TODO Step 3: Read Tauri store (settings.json) 29 + // TODO Step 4: Fetch device location 30 + // TODO Step 5: Send location to server 31 + 32 + Log.i(TAG, "LocationWorker finished successfully") 33 + return Result.success() 34 + } 35 + }
+3
app/src-tauri/gen/android/app/src/main/java/dev/azom/privacypin/MainActivity.kt
··· 19 19 super.onCreate(savedInstanceState) 20 20 registerPermissionLaunchers() 21 21 requestRequiredPermissions() 22 + 23 + // Auto-start for testing — will move to Tauri plugin bridge in Step 6 24 + LocationScheduler.start(this) 22 25 } 23 26 24 27 private fun registerPermissionLaunchers() {