How to update appwidget automatically if calendar data has changed?

Viewed 26

I want to update appwidget automatically if calendar provider data has changed, but listening to calendar changes through intent ACTION_PROVIDER_CHANGED works on not all the Android versions.

My method is below.

In Manifest:

<receiver
    android:name="my.package.name.WidgetProvider"
    android:exported="true"
    android:label="@string/label_period" >
    <intent-filter>
        <action android:name="android.intent.action.PROVIDER_CHANGED" />
        <data android:scheme="content" />
        <data android:host="com.android.calendar" />
    </intent-filter>
    
    <meta-data
        android:name="android.appwidget.provider"
        android:resource="@xml/widget_period_info" />
</receiver>

Then in AppWidgetProvider:

override fun onReceive(context: Context, intent: Intent) {

if (intent.action.equals(Intent.ACTION_PROVIDER_CHANGED)) {
    val thisAppWidget = ComponentName(
        context.packageName, javaClass.name
    )
    val appWidgetManager = AppWidgetManager
        .getInstance(context)
    val ids = appWidgetManager.getAppWidgetIds(thisAppWidget)
    // Update widgets
    for (appWidgetId in ids) {
            updateWidget(
                context,
                appWidgetManager,
                appWidgetId
            )
    }
}

super.onReceive(context, intent)
}

Particularly, this method works on my phone with Android 10, but it doesn't on the phone with Android 12 (appwidget doesn't receive intent in case of Android 12).

How to listen to if calendar data has changed by any other alternative method working for all the versions of Android in case of appwidgets?

Would be very grateful for sharing correct, working method.

P.S. I've read about ContentObserver in the Service and JobScheduler for this task, but don't know what's better and how can be implemented for appwidgets.

0 Answers
Related