I have created an Appwidget in Android, and provided two buttons but I have found that during interacting with it sometimes, the UPDATE signal is being invoked and some times it doesn't.
Following is the implementation of ClockWidgetWorker
class ClockWidgetWorker (pContext: Context?, pWorkerParams: WorkerParameters?) : Worker(pContext!!, pWorkerParams!!) {
companion object {
fun getCurrentTime (pContext : Context) : String
{
Log.d("AppWidget", "Inside getCurrentTime")
val views = RemoteViews (pContext.packageName, R.layout.widget_layout)
val sdf = SimpleDateFormat ("HH:mm:ss", Locale.getDefault ())
val update_time = sdf.format (Date ())
views.setTextViewText(R.id.time_text, update_time)
AppWidgetManager.getInstance (pContext).updateAppWidget (ComponentName (pContext, ClockWidgetProvider::class.java), views)
return update_time
}
}
override fun doWork () : Result
{
Log.d("AppWidget", "Inside doWork")
val context: Context = applicationContext
getCurrentTime(context)
return Result.success ()
}}
Following is the implementation of ClockWidgetProvider
class ClockWidgetProvider : AppWidgetProvider () {
var vViews : RemoteViews? =null
companion object {
private const val sWorkerRunning = false
}
// onEnabled is invoked only once
override
fun onEnabled (pContext : Context)
{
Log.d("AppWidget", "Inside onEnabled")
super.onEnabled(pContext)
vViews = RemoteViews (pContext.packageName, R.layout.widget_layout)
vViews?.setOnClickPendingIntent (R.id.refresh_button, getSelfPendingCurrent(pContext))
val intent : Intent = Intent (pContext, MainActivity::class.java)
val pendingIntent : PendingIntent = PendingIntent.getActivity (pContext, 0, intent, PendingIntent.FLAG_IMMUTABLE)
vViews?.setOnClickPendingIntent (R.id.OpenButton, pendingIntent)
// Create a periodic work request to refresh the app widget's data every 15 mins
val refreshWork: PeriodicWorkRequest = PeriodicWorkRequestBuilder<ClockWidgetWorker> (15, TimeUnit.MINUTES)
.build ()
WorkManager.getInstance (pContext).enqueueUniquePeriodicWork ("MyTAG", ExistingPeriodicWorkPolicy.UPDATE, refreshWork)
}
override
fun onUpdate(pContext : Context, pAppWidgetManager : AppWidgetManager, pAppWidgetIds : IntArray)
{
Log.d("AppWidget", "Inside onUpdate")
for (appWidgetId in pAppWidgetIds)
pAppWidgetManager.updateAppWidget (appWidgetId, vViews)
}
override
fun onReceive (pContext : Context, pIntent : Intent)
{
Log.d("AppWidget", "Inside onReceive")
Log.d("AppWidget", "Action-->" + pIntent.action)
super.onReceive(pContext, pIntent)
if (AppWidgetManager.ACTION_APPWIDGET_UPDATE == pIntent.action) {
Log.d("AppWidget", "Inside first if of onReceive")
if (!sWorkerRunning) {
Log.d("AppWidget", "Inside second if of onReceive")
val update_time = ClockWidgetWorker.getCurrentTime(pContext)
Log.d("AppWidget", "Updated Time-->$update_time")
}
}
}
override
fun onDisabled (pContext : Context)
{
Log.d("AppWidget", "Inside onDisabled")
super.onDisabled(pContext)
WorkManager.getInstance(pContext).cancelUniqueWork("Tally")
}
private
fun getSelfPendingCurrent (pContext : Context) : PendingIntent
{
val intent = Intent (pContext, javaClass)
intent.action = AppWidgetManager.ACTION_APPWIDGET_UPDATE
val request_code = 5
return PendingIntent.getBroadcast(pContext, request_code, intent, PendingIntent.FLAG_IMMUTABLE)
}}
Help is appreciated