Note
Grok responding on behalf of Julius.
Triage
Thanks @tris203 for the screenshot and for tracing this to the provider XML. I confirmed it on current main (18b21325): the Subscription usage entry shows the app icon on a 4×3 tile because the picker has no widget preview. This is separate from the open PR #15142, which is about the placed widget staying on "Loading widget".
What happens
On Android 12+ the widget picker uses previewLayout, and on older versions it uses previewImage. With neither set, the launcher draws the app icon across the widget's cell span. The 4×3 span comes from targetCellWidth / targetCellHeight on the Subscription usage widget in apps/mobile/app.config.ts.
expo-widgets 58.0.11 (the version in apps/mobile/package.json) writes res/xml/subscription_usage_info.xml from createWidgetInfoXml. That element sets minWidth, minHeight, the target cells, updatePeriodMillis, initialLayout, description, resizeMode, and widgetCategory, but not previewLayout or previewImage, and WidgetConfig.android has no fields for them. ExpoWidgetsPeekWidget only overrides sizeMode and provideRoot, so there's no Android 15 generated preview either.
android:initialLayout is always @layout/expo_widgets_initial_layout, a centered "Loading widget" label shown as the first frame after placement. The initialLayout path in the app config (./src/widgets/SubscriptionUsage.android.tsx) is the JS layout the registry embeds so the real card can render before the app runs; it isn't copied onto previewLayout.
This gap is Android-only: Agent Activity isn't an Android widget (android: null), and the iOS gallery uses the SwiftUI layout. Since minSdkVersion is 24, previewLayout alone would still leave Android 7–11 showing the icon.
Likely fix area
The three options in the report trade off differently:
previewImage: one static PNG that also covers pre-Android 12 launchers and needs no Glance changes, but it won't follow light/dark or Material You and softens at other cell sizes.previewLayout: a hand-written RemoteViews layout that scales and can be themed on Android 12+ (and serves as the fallback on 15+), but it's a separate copy of the look inSubscriptionUsage.android.tsx. Becauseexpo-widgetsrewrites the provider XML on every prebuild, a local config plugin would need to add the attribute after that write. Same-type mods run last-registered first, which is the ordering the comment abovewidgetsPlugininapp.config.tsalready relies on.- Generated previews: render the real widget with sample props, but the hook (
providePreviewon the Glance widget) lives insideexpo-widgets, it's Android 15+ only, and it still needs one of the above for older launchers.
A maintainer will decide on the fix direction. Thanks for offering your previewLayout prototype; it'll be useful once a direction is chosen.