automatically update OSM data

This commit is contained in:
johan12345
2025-07-13 22:54:07 +02:00
parent f409ded73a
commit fbdda89219
3 changed files with 66 additions and 2 deletions

View File

@@ -6,10 +6,12 @@ import android.os.Build
import androidx.work.Configuration
import androidx.work.Constraints
import androidx.work.ExistingPeriodicWorkPolicy
import androidx.work.NetworkType
import androidx.work.PeriodicWorkRequestBuilder
import androidx.work.WorkManager
import net.vonforst.evmap.storage.CleanupCacheWorker
import net.vonforst.evmap.storage.PreferenceDataSource
import net.vonforst.evmap.storage.UpdateFullDownloadWorker
import net.vonforst.evmap.ui.updateAppLocale
import net.vonforst.evmap.ui.updateNightMode
import org.acra.config.dialog
@@ -68,6 +70,7 @@ class EvMapApplication : Application(), Configuration.Provider {
}
}
val workManager = WorkManager.getInstance(this)
val cleanupCacheRequest = PeriodicWorkRequestBuilder<CleanupCacheWorker>(Duration.ofDays(1))
.setConstraints(Constraints.Builder().apply {
setRequiresBatteryNotLow(true)
@@ -75,9 +78,24 @@ class EvMapApplication : Application(), Configuration.Provider {
setRequiresDeviceIdle(true)
}
}.build()).build()
WorkManager.getInstance(this).enqueueUniquePeriodicWork(
workManager.enqueueUniquePeriodicWork(
"CleanupCacheWorker", ExistingPeriodicWorkPolicy.UPDATE, cleanupCacheRequest
)
val updateFullDownloadRequest =
PeriodicWorkRequestBuilder<UpdateFullDownloadWorker>(Duration.ofDays(7))
.setConstraints(Constraints.Builder().apply {
setRequiresBatteryNotLow(true)
setRequiredNetworkType(NetworkType.UNMETERED)
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) {
setRequiresDeviceIdle(true)
}
}.build()).build()
workManager.enqueueUniquePeriodicWork(
"UpdateOsmWorker",
ExistingPeriodicWorkPolicy.UPDATE,
updateFullDownloadRequest
)
}
override val workManagerConfiguration = Configuration.Builder().build()

View File

@@ -15,7 +15,7 @@ class CleanupCacheWorker(appContext: Context, workerParams: WorkerParameters) :
val savedRegionDao = db.savedRegionDao()
val now = Instant.now()
val dataSources = listOf("openchargemap", "goingelectric")
val dataSources = listOf("openchargemap", "openstreetmap", "goingelectric")
for (dataSource in dataSources) {
val api = createApi(dataSource, applicationContext)
val limit = now.minus(api.cacheLimit).toEpochMilli()

View File

@@ -0,0 +1,46 @@
package net.vonforst.evmap.storage
import android.content.Context
import androidx.work.CoroutineWorker
import androidx.work.WorkerParameters
import kotlinx.coroutines.Dispatchers
import kotlinx.coroutines.Job
import kotlinx.coroutines.launch
import kotlinx.coroutines.withContext
import net.vonforst.evmap.api.createApi
import net.vonforst.evmap.api.openstreetmap.OSMReferenceData
import net.vonforst.evmap.api.openstreetmap.OpenStreetMapApiWrapper
class UpdateFullDownloadWorker(appContext: Context, workerParams: WorkerParameters) :
CoroutineWorker(appContext, workerParams) {
override suspend fun doWork(): Result {
val dataSource = PreferenceDataSource(applicationContext).dataSource
val db = AppDatabase.getInstance(applicationContext)
val chargeLocations = db.chargeLocationsDao()
val api = createApi(dataSource, applicationContext)
if (!api.supportsFullDownload) return Result.success()
var insertJob: Job? = null
val result = api.fullDownload()
result.chargers.chunked(1024).forEach {
insertJob?.join()
insertJob = withContext(Dispatchers.IO) {
launch {
chargeLocations.insert(*it.toTypedArray())
}
}
}
when (api) {
is OpenStreetMapApiWrapper -> {
val refData = result.referenceData
val repo = OSMReferenceDataRepository(db.osmReferenceDataDao())
repo.updateReferenceData(refData as OSMReferenceData)
}
}
// TODO: remove deleted chargers
return Result.success()
}
}