Generate and publish the widget previews for a [GlanceAppWidgetReceiver] for the given set of [widgetCategories].
suspend fun setWidgetPreviews(context: Context) {
if (Build.VERSION.SDK_INT < Build.VERSION_CODES.VANILLA_ICE_CREAM) {
return
}
fun Class<GlanceAppWidgetReceiver>.hasPreviewForCategory(widgetCategory: Int): Boolean {
val component = ComponentName(context, this)
val providerInfo =
(context.getSystemService(Context.APPWIDGET_SERVICE) as AppWidgetManager)
.installedProviders
.first { providerInfo -> providerInfo.provider == component }
return providerInfo.generatedPreviewCategories.and(widgetCategory) != 0
}
val receiverClasses = listOf<Class<GlanceAppWidgetReceiver>>()
val glanceAppWidgetManager = GlanceAppWidgetManager(context)
withContext(Dispatchers.Default) {
try {
for (receiver in receiverClasses) {
if (receiver.hasPreviewForCategory(WIDGET_CATEGORY_HOME_SCREEN)) {
Log.i("Widget", "Skipped updating previews for $receiver")
continue
}
if (
glanceAppWidgetManager.setWidgetPreviews(receiver.kotlin) ==
SET_WIDGET_PREVIEWS_RESULT_RATE_LIMITED
) {
Log.e("Widget", "Failed to set previews for $receiver, rate limited")
}
}
} catch (e: Exception) {
Log.e("Widget", "Error thrown when calling setWidgetPreview", e)
}
}
}