Legg til automatisk widgetoppdatering og de-Google-retningslinjer (v1.3.1)

Widget oppdaterer seg sjølv via WorkManager kvar 15. min i bakgrunnen,
og i sanntid når appen er open og mottek GPS-oppdateringar.
Oppdaterer CLAUDE.md med de-Google-kompatibilitetsprinsipp.

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
This commit is contained in:
Ole-Morten Duesund 2026-03-08 22:34:33 +01:00
commit 3c49dbdcde
6 changed files with 95 additions and 5 deletions

View file

@ -91,6 +91,9 @@ dependencies {
// Google Play Services Location (precise GPS)
implementation("com.google.android.gms:play-services-location:21.3.0")
// WorkManager (periodic widget updates)
implementation("androidx.work:work-runtime-ktx:2.9.1")
// Coroutines
implementation("org.jetbrains.kotlinx:kotlinx-coroutines-android:1.8.1")
}

View file

@ -39,6 +39,7 @@ import no.naiv.tilfluktsrom.location.ShelterFinder
import no.naiv.tilfluktsrom.location.ShelterWithDistance
import no.naiv.tilfluktsrom.ui.ShelterListAdapter
import no.naiv.tilfluktsrom.util.DistanceUtils
import no.naiv.tilfluktsrom.widget.ShelterWidgetProvider
import org.osmdroid.util.GeoPoint
import org.osmdroid.views.CustomZoomButtonsController
import org.osmdroid.views.overlay.Marker
@ -414,6 +415,7 @@ class MainActivity : AppCompatActivity(), SensorEventListener {
}
updateSelectedShelterUI()
ShelterWidgetProvider.requestUpdate(this)
}
/**

View file

@ -23,8 +23,11 @@ import no.naiv.tilfluktsrom.util.DistanceUtils
/**
* Home screen widget showing the nearest shelter with distance.
*
* Update strategy: no automatic periodic updates (updatePeriodMillis=0).
* Updates only when the user taps the refresh button, which sends ACTION_REFRESH.
* Update strategy:
* - Background: WorkManager runs every 15 min while widget exists
* - Live: MainActivity sends ACTION_REFRESH on each GPS location update
* - Manual: user taps the refresh button on the widget
*
* Tapping the widget body opens MainActivity.
*
* Uses LocationManager directly (not the hybrid LocationProvider) because
@ -36,6 +39,24 @@ class ShelterWidgetProvider : AppWidgetProvider() {
companion object {
private const val TAG = "ShelterWidget"
const val ACTION_REFRESH = "no.naiv.tilfluktsrom.widget.REFRESH"
/** Trigger a widget refresh from anywhere (e.g. MainActivity on location update). */
fun requestUpdate(context: Context) {
val intent = Intent(context, ShelterWidgetProvider::class.java).apply {
action = ACTION_REFRESH
}
context.sendBroadcast(intent)
}
}
override fun onEnabled(context: Context) {
super.onEnabled(context)
WidgetUpdateWorker.schedule(context)
}
override fun onDisabled(context: Context) {
super.onDisabled(context)
WidgetUpdateWorker.cancel(context)
}
override fun onUpdate(

View file

@ -0,0 +1,48 @@
package no.naiv.tilfluktsrom.widget
import android.content.Context
import androidx.work.CoroutineWorker
import androidx.work.ExistingPeriodicWorkPolicy
import androidx.work.PeriodicWorkRequestBuilder
import androidx.work.WorkManager
import androidx.work.WorkerParameters
import java.util.concurrent.TimeUnit
/**
* Periodic background worker that refreshes the home screen widget.
*
* Scheduled every 15 minutes (WorkManager's minimum interval).
* Simply triggers the widget's existing update logic via broadcast.
*/
class WidgetUpdateWorker(
context: Context,
params: WorkerParameters
) : CoroutineWorker(context, params) {
override suspend fun doWork(): Result {
ShelterWidgetProvider.requestUpdate(applicationContext)
return Result.success()
}
companion object {
private const val WORK_NAME = "widget_update"
/** Schedule periodic widget updates. Safe to call multiple times. */
fun schedule(context: Context) {
val request = PeriodicWorkRequestBuilder<WidgetUpdateWorker>(
15, TimeUnit.MINUTES
).build()
WorkManager.getInstance(context).enqueueUniquePeriodicWork(
WORK_NAME,
ExistingPeriodicWorkPolicy.KEEP,
request
)
}
/** Cancel periodic updates (e.g. when all widgets are removed). */
fun cancel(context: Context) {
WorkManager.getInstance(context).cancelUniqueWork(WORK_NAME)
}
}
}