mirror of
https://github.com/ev-map/EVMap.git
synced 2026-04-30 19:14:22 -04:00
delete outdated cached chargers from DB
This commit is contained in:
committed by
Johan von Forstner
parent
edfce541f6
commit
d16d48bf8f
@@ -184,6 +184,7 @@ dependencies {
|
||||
implementation 'androidx.browser:browser:1.5.0'
|
||||
implementation 'androidx.swiperefreshlayout:swiperefreshlayout:1.1.0'
|
||||
implementation 'androidx.security:security-crypto:1.1.0-alpha06'
|
||||
implementation "androidx.work:work-runtime-ktx:2.7.1"
|
||||
implementation 'com.github.ev-map:CustomBottomSheetBehavior:e48f73ea7b'
|
||||
implementation 'com.squareup.retrofit2:retrofit:2.9.0'
|
||||
implementation 'com.squareup.retrofit2:converter-moshi:2.9.0'
|
||||
|
||||
@@ -1,5 +1,6 @@
|
||||
<?xml version="1.0" encoding="utf-8"?>
|
||||
<manifest xmlns:android="http://schemas.android.com/apk/res/android">
|
||||
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
|
||||
xmlns:tools="http://schemas.android.com/tools">
|
||||
|
||||
<uses-permission android:name="android.permission.INTERNET" />
|
||||
<uses-permission android:name="android.permission.ACCESS_COARSE_LOCATION" />
|
||||
@@ -287,6 +288,18 @@
|
||||
android:name="autoStoreLocales"
|
||||
android:value="true" />
|
||||
</service>
|
||||
|
||||
<provider
|
||||
android:name="androidx.startup.InitializationProvider"
|
||||
android:authorities="${applicationId}.androidx-startup"
|
||||
android:exported="false"
|
||||
tools:node="merge">
|
||||
<!-- Remove WorkManagerInitializer as we implement getWorkManagerConfiguration in application class -->
|
||||
<meta-data
|
||||
android:name="androidx.work.WorkManagerInitializer"
|
||||
android:value="androidx.startup"
|
||||
tools:node="remove" />
|
||||
</provider>
|
||||
</application>
|
||||
|
||||
</manifest>
|
||||
@@ -1,6 +1,9 @@
|
||||
package net.vonforst.evmap
|
||||
|
||||
import android.app.Application
|
||||
import android.os.Build
|
||||
import androidx.work.*
|
||||
import net.vonforst.evmap.storage.CleanupCacheWorker
|
||||
import net.vonforst.evmap.storage.PreferenceDataSource
|
||||
import net.vonforst.evmap.ui.updateAppLocale
|
||||
import net.vonforst.evmap.ui.updateNightMode
|
||||
@@ -9,8 +12,9 @@ import org.acra.config.limiter
|
||||
import org.acra.config.mailSender
|
||||
import org.acra.data.StringFormat
|
||||
import org.acra.ktx.initAcra
|
||||
import java.time.Duration
|
||||
|
||||
class EvMapApplication : Application() {
|
||||
class EvMapApplication : Application(), Configuration.Provider {
|
||||
override fun onCreate() {
|
||||
super.onCreate()
|
||||
val prefs = PreferenceDataSource(this)
|
||||
@@ -48,5 +52,20 @@ class EvMapApplication : Application() {
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
val cleanupCacheRequest = PeriodicWorkRequestBuilder<CleanupCacheWorker>(Duration.ofDays(1))
|
||||
.setConstraints(Constraints.Builder().apply {
|
||||
setRequiresBatteryNotLow(true)
|
||||
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) {
|
||||
setRequiresDeviceIdle(true)
|
||||
}
|
||||
}.build()).build()
|
||||
WorkManager.getInstance(this).enqueueUniquePeriodicWork(
|
||||
"CleanupCacheWorker", ExistingPeriodicWorkPolicy.REPLACE, cleanupCacheRequest
|
||||
)
|
||||
}
|
||||
|
||||
override fun getWorkManagerConfiguration(): Configuration {
|
||||
return Configuration.Builder().build()
|
||||
}
|
||||
}
|
||||
@@ -9,6 +9,7 @@ import net.vonforst.evmap.api.openchargemap.OpenChargeMapApiWrapper
|
||||
import net.vonforst.evmap.model.*
|
||||
import net.vonforst.evmap.viewmodel.Resource
|
||||
import java.time.Duration
|
||||
import java.time.Instant
|
||||
|
||||
interface ChargepointApi<out T : ReferenceData> {
|
||||
/**
|
||||
|
||||
@@ -50,6 +50,9 @@ abstract class ChargeLocationsDao {
|
||||
@Delete
|
||||
abstract suspend fun delete(vararg locations: ChargeLocation)
|
||||
|
||||
@Query("DELETE FROM chargelocation WHERE dataSource == :dataSource AND timeRetrieved <= :before AND NOT EXISTS (SELECT 1 FROM favorite WHERE favorite.chargerId = chargelocation.id)")
|
||||
abstract suspend fun deleteOutdatedIfNotFavorite(dataSource: String, before: Long)
|
||||
|
||||
@Query("SELECT * FROM chargelocation WHERE dataSource == :dataSource AND id == :id AND isDetailed == 1 AND timeRetrieved > :after")
|
||||
abstract fun getChargeLocationById(
|
||||
id: Long,
|
||||
@@ -303,14 +306,6 @@ class ChargeLocationsRepository(
|
||||
return PreferCacheLiveData(dbResult, apiResult, cacheSoftLimit)
|
||||
}
|
||||
|
||||
/**
|
||||
* Numeric date for database limit required limit on some APIs
|
||||
*/
|
||||
private fun afterDate(): Long {
|
||||
val cacheLimit = this.api.value!!.cacheLimit
|
||||
return Instant.now().minus(cacheLimit).toEpochMilli()
|
||||
}
|
||||
|
||||
fun getFilters(sp: StringProvider) = MediatorLiveData<List<Filter<FilterValue>>>().apply {
|
||||
addSource(referenceData) { refData: ReferenceData? ->
|
||||
refData?.let { value = api.value!!.getFilters(refData, sp) }
|
||||
|
||||
@@ -0,0 +1,27 @@
|
||||
package net.vonforst.evmap.storage
|
||||
|
||||
import android.content.Context
|
||||
import androidx.work.CoroutineWorker
|
||||
import androidx.work.WorkerParameters
|
||||
import net.vonforst.evmap.api.createApi
|
||||
import java.time.Instant
|
||||
|
||||
class CleanupCacheWorker(appContext: Context, workerParams: WorkerParameters) :
|
||||
CoroutineWorker(appContext, workerParams) {
|
||||
override suspend fun doWork(): Result {
|
||||
val db = AppDatabase.getInstance(applicationContext)
|
||||
|
||||
val chargeLocations = db.chargeLocationsDao()
|
||||
val savedRegionDao = db.savedRegionDao()
|
||||
val now = Instant.now()
|
||||
|
||||
val dataSources = listOf("openchargemap", "goingelectric")
|
||||
for (dataSource in dataSources) {
|
||||
val api = createApi(dataSource, applicationContext)
|
||||
val limit = now.minus(api.cacheLimit).toEpochMilli()
|
||||
chargeLocations.deleteOutdatedIfNotFavorite(dataSource, limit)
|
||||
savedRegionDao.deleteOutdated(dataSource, limit)
|
||||
}
|
||||
return Result.success()
|
||||
}
|
||||
}
|
||||
Reference in New Issue
Block a user