[Bug]: Android Subscription usage widget can no longer be resized smaller than 4×3#15225

openedOct 3, 2026byTtris203

Before submitting

  • I searched existing issues and did not find a duplicate.
  • I included enough detail to reproduce or investigate the problem.

Area

apps/mobile

Steps to reproduce

  1. Install a T3 Code Android build that includes #12046 (2.0.0, or any nightly from 2026-10-01 onwards).
  2. Add the Subscription usage widget to the home screen. It is placed at 4×3.
  3. Long-press the widget and drag the resize handles inwards.

Expected behavior

The widget shrinks below its default size, as it did before #12046. The old widget declared a resize floor of 180×130dp.

Actual behavior

The widget can be made larger but not smaller than its default 250×180dp footprint. The resize floor is now the same as the default size.

Impact

Users who kept the widget at a smaller size can no longer do so, and a 4×3 block is the minimum home-screen space it can occupy.

Version or commit

main at 18b21325c3. Introduced by #12046 (e41755cf8a), first shipped in v0.0.45-nightly.20261001.2552.

This surfaced at the same time as the orchestrator V2 merge (#2829, one day later), but that commit does not touch any widget file.

Root cause

#12046 replaced the hand-written AppWidgetProvider with expo-widgets. Its description says the new android config block mirrors the old widget info XML, but two attributes had no equivalent and were dropped.

Before (apps/mobile/modules/t3-subscription-widget/android/src/main/res/xml/t3_subscription_widget_info.xml at e41755cf8a^):

xml
1<appwidget-provider xmlns:android="http://schemas.android.com/apk/res/android"
2 android:minWidth="250dp" android:minHeight="180dp"
3 android:minResizeWidth="180dp" android:minResizeHeight="130dp"
4 android:targetCellWidth="4" android:targetCellHeight="3"
5 android:resizeMode="horizontal|vertical" android:widgetCategory="home_screen"
6 android:updatePeriodMillis="1800000"
7 android:description="@string/t3_subscription_widget_description"
8 android:initialLayout="@layout/t3_subscription_widget"
9 android:previewLayout="@layout/t3_subscription_widget" />

After (subscription_usage_info.xml, produced by running expo-widgets 58.0.11's own withAndroidWidgetFiles generator against the android block in apps/mobile/app.config.ts):

xml
1<appwidget-provider xmlns:android="http://schemas.android.com/apk/res/android"
2 android:minWidth="250dp"
3 android:minHeight="180dp"
4 android:targetCellWidth="4"
5 android:targetCellHeight="3"
6 android:updatePeriodMillis="0"
7 android:initialLayout="@layout/expo_widgets_initial_layout"
8 android:description="@string/subscription_usage_description"
9 android:resizeMode="horizontal|vertical"
10 android:widgetCategory="home_screen" />

minResizeWidth and minResizeHeight are gone. When they are absent, Android uses minWidth/minHeight as the floor. From AppWidgetServiceImpl.parseAppWidgetProviderInfo in AOSP:

java
1info.minResizeWidth = value != null ? value.data : info.minWidth;
2...
3info.minResizeHeight = value != null ? value.data : info.minHeight;

So the floor moved from 180×130dp to 250×180dp. resizeMode is unchanged, which is why growing still works.

This cannot be fixed with plugin options alone:

  • WidgetConfig.android in expo-widgets only accepts minWidth, minHeight, targetCellWidth, targetCellHeight, resizeMode and initialLayout. The XML template is a fixed string. This is true of 58.0.11 (pinned) and 58.0.12 (current next).
  • patches/expo-widgets@58.0.11.patch does not touch the Android plugin.

The dropped previewLayout in the same diff is #15158, so the two share a cause.

Options

ApproachChangeTrade-off
Lower minWidth/minHeight to 180/130 (suggested)Two numbers in app.config.tsRestores the old floor exactly. On Android 12+ the default placement stays 4×3 because targetCellWidth/targetCellHeight take precedence. On Android 7–11, where targetCell* is ignored, the widget would be placed at the smaller size by default.
Config plugin that adds minResizeWidth/minResizeHeight to the generated XMLNew plugin registered before expo-widgets, like withWidgetLogoAsset.cjsExact restoration on every Android version, but new machinery for two attributes. Worth it if #15158 goes the previewLayout route, since that needs the same plugin and both attributes could be set in one place.
Extend patches/expo-widgets@58.0.11.patch to add the fields to the pluginPatch compiled plugin/build JS and typesHas to be re-rolled on every expo-widgets bump (58.0.12 is already out). Better proposed upstream than carried locally.

The layout also needs to cope with the smaller size

Restoring the floor alone will let the widget shrink into a size its content does not fit:

  • The old widget put its rows in a ListView (made scrollable in #13474), so anything that did not fit could be scrolled.
  • The new layout in apps/mobile/src/widgets/SubscriptionUsage.android.tsx is a fixed Column that always shows up to two quotas per provider plus a footer. Its own comment says it is sized for the 4×3 default cell.
  • It cannot adapt to size from JS: on Android, getWidgetEnvironment only passes colorScheme and Material colours, not the widget's dimensions.

The expo-widgets Android runtime does support LazyColumnView, so wrapping the provider list in a lazy column would bring back scrolling. I have not tested how the current layout renders at 180×130dp.

Environment

Traced from source; I have not captured a device recording. expo-widgets 58.0.11, Expo 58.0.2.

Note

Grok responding on behalf of Julius.

Triage

Thanks @tris203 for the thorough root-cause write-up and the options table. I confirmed this on current main. It's a regression from the merged #12046, not from the orchestrator V2 merge, and it isn't a duplicate of #15158, which is the dropped previewLayout in the same generated provider XML.

What I verified

Before e41755cf8a, t3_subscription_widget_info.xml set minWidth/minHeight to 250×180dp and minResizeWidth/minResizeHeight to 180×130dp. expo-widgets 58.0.11 and 58.0.12 still emit a fixed createWidgetInfoXml with only minWidth, minHeight, targetCellWidth, targetCellHeight, and resizeMode, and apps/mobile/app.config.ts sets those to 250, 180, 4, and 3. patches/expo-widgets@58.0.11.patch doesn't touch the Android plugin. With minResize* absent, AppWidgetServiceImpl uses minWidth/minHeight as the resize floor, so the widget can grow but not shrink.

Likely fix area

A maintainer will decide on the fix direction. Two notes on your options:

  • Lowering minWidth/minHeight to 180/130 restores the floor, and on Android 12+ the 4×3 default stays because targetCell* wins. Since minSdkVersion is 24, devices on Android 7–11 would also get the smaller default placement.
  • A config plugin that writes minResizeWidth/minResizeHeight onto the generated XML keeps the old default on every supported version, and it's the same hook #15158 would need for previewLayout.

Either way, restoring the floor isn't enough on its own. SubscriptionUsage.android.tsx is a fixed Column sized for 4×3, while the old widget was a scrollable ListView. getWidgetEnvironment only passes colorScheme, an empty configuration, and materialColors. Glance does receive the exact DpSize in ExpoWidgetsPeekWidget.provideRoot, but it isn't forwarded to JS, so the layout can't branch on size. LazyColumnView is already mapped in the Android widget runtime, which is the likely path back to scrolling.