@@ -21,33 +21,83 @@ package org.blitzortung.android.app
2121import android.appwidget.AppWidgetManager
2222import android.appwidget.AppWidgetProvider
2323import android.content.Context
24- import android.widget.RemoteViews
25- import org.blitzortung.android.app.view.AlarmView
24+ import android.util.Log
25+ import androidx.work.Constraints
26+ import androidx.work.ExistingPeriodicWorkPolicy
27+ import androidx.work.ExistingWorkPolicy
28+ import androidx.work.NetworkType
29+ import androidx.work.OneTimeWorkRequestBuilder
30+ import androidx.work.PeriodicWorkRequestBuilder
31+ import androidx.work.WorkManager
32+ import java.util.concurrent.TimeUnit
2633
27- class WidgetProvider : AppWidgetProvider () {
28- override fun onUpdate (
34+ open class WidgetProvider : AppWidgetProvider () {
35+
36+ companion object {
37+ const val WIDGET_UPDATE_WORK_NAME = " widget_update_work"
38+ const val WIDGET_IMMEDIATE_UPDATE_WORK_NAME = " widget_immediate_update_work"
39+ const val UPDATE_INTERVAL_MINUTES = 15L
40+ }
41+
42+ override fun onUpdate (context : Context , appWidgetManager : AppWidgetManager , appWidgetIds : IntArray ) {
43+ super .onUpdate(context, appWidgetManager, appWidgetIds)
44+ Log .v(Main .LOG_TAG , " WidgetProvider.onUpdate() - re-rendering with new size" )
45+ scheduleImmediateUpdate(context)
46+ scheduleNextUpdate(context)
47+ }
48+
49+ override fun onEnabled (context : Context ) {
50+ super .onEnabled(context)
51+ Log .v(Main .LOG_TAG , " WidgetProvider.onEnabled() - Scheduling immediate and periodic updates" )
52+ scheduleImmediateUpdate(context)
53+ scheduleNextUpdate(context)
54+ }
55+
56+ protected open fun getWorkManager (context : Context ): WorkManager = WorkManager .getInstance(context)
57+
58+ private fun scheduleImmediateUpdate (context : Context ) {
59+ val constraints = Constraints .Builder ()
60+ .setRequiredNetworkType(NetworkType .CONNECTED )
61+ .build()
62+ val workRequest = OneTimeWorkRequestBuilder <WidgetUpdateWorker >()
63+ .setConstraints(constraints)
64+ .build()
65+ getWorkManager(context).enqueueUniqueWork(
66+ WIDGET_IMMEDIATE_UPDATE_WORK_NAME ,
67+ ExistingWorkPolicy .REPLACE ,
68+ workRequest
69+ )
70+ }
71+
72+ override fun onDisabled (context : Context ) {
73+ super .onDisabled(context)
74+ Log .v(Main .LOG_TAG , " WidgetProvider.onDisabled() - Cancelling periodic updates" )
75+ getWorkManager(context).cancelUniqueWork(WIDGET_UPDATE_WORK_NAME )
76+ }
77+
78+ override fun onAppWidgetOptionsChanged (
2979 context : Context ,
3080 appWidgetManager : AppWidgetManager ,
31- appWidgetIds : IntArray ,
81+ appWidgetId : Int ,
82+ newOptions : android.os.Bundle ?
3283 ) {
33- for (element in appWidgetIds) {
34- element
35- updateAppWidget(context)
36- }
84+ super .onAppWidgetOptionsChanged(context, appWidgetManager, appWidgetId, newOptions)
85+ Log .v(Main .LOG_TAG , " WidgetProvider.onAppWidgetOptionsChanged() - re-rendering with new size" )
86+ scheduleImmediateUpdate(context)
3787 }
3888
39- private fun updateAppWidget (context : Context ) {
40- val alarmView = AlarmView (context )
41- alarmView.measure( 150 , 150 )
42- alarmView.layout( 0 , 0 , 150 , 150 )
43- alarmView.isDrawingCacheEnabled = true
44- val bitmap = alarmView.drawingCache
45-
46- val remoteViews =
47- RemoteViews (
48- context.packageName ,
49- R .layout.widget ,
50- )
51- remoteViews.setImageViewBitmap( R .layout.widget, bitmap )
89+ private fun scheduleNextUpdate (context : Context ) {
90+ val constraints = Constraints . Builder ( )
91+ .setRequiredNetworkType( NetworkType . CONNECTED )
92+ .build( )
93+ val workRequest = PeriodicWorkRequestBuilder < WidgetUpdateWorker >( UPDATE_INTERVAL_MINUTES , TimeUnit . MINUTES )
94+ .setConstraints(constraints)
95+ .build()
96+
97+ getWorkManager(context).enqueueUniquePeriodicWork (
98+ WIDGET_UPDATE_WORK_NAME ,
99+ ExistingPeriodicWorkPolicy . KEEP ,
100+ workRequest
101+ )
52102 }
53103}
0 commit comments