7

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

Rohan Pande
  • 301
  • 1
  • 5

0 Answers0