package com.parkplants.map import android.content.Context import androidx.hilt.work.HiltWorker import androidx.work.* import dagger.assisted.Assisted import dagger.assisted.AssistedInject /** * Background WorkManager job that prefetches OSM map tiles for the park area. * Runs only when network is available. Safe to re-enqueue — skips cached tiles. */ @HiltWorker class TilePrefetchWorker @AssistedInject constructor( @Assisted context: Context, @Assisted params: WorkerParameters, ) : CoroutineWorker(context, params) { override suspend fun doWork(): Result { return try { TilePrefetcher.prefetch(applicationContext) { done, total -> setProgressAsync(workDataOf(KEY_DONE to done, KEY_TOTAL to total)) } Result.success() } catch (e: Exception) { // Non-fatal — map works online without prefetch Result.failure() } } companion object { const val WORK_NAME = "tile_prefetch" const val KEY_DONE = "done" const val KEY_TOTAL = "total" fun enqueue(workManager: WorkManager) { workManager.enqueueUniqueWork( WORK_NAME, ExistingWorkPolicy.KEEP, OneTimeWorkRequestBuilder() .setConstraints( Constraints.Builder() .setRequiredNetworkType(NetworkType.CONNECTED) .build() ) .build() ) } } }