Loading...
Loading...
Create, migrate, update, and verify Wear OS widgets using Glance Wear and Remote Compose in an Android project. Use this skill when implementing GlanceWearWidget, GlanceWearWidgetService, WearWidgetDocument, Remote Compose UI primitives (RemoteColumn, RemoteRow, RemoteBox, RemoteText, RemoteImage, RemoteButton), local state with rememberMutableRemoteInt and valueChange, click actions with pendingIntentAction, widget provider XML containers (SMALL and LARGE), rectangular widget picker PNG previews, or migrating legacy ProtoLayout TileService tiles to Wear OS widgets. Don't use for mobile home screen AppWidgetProvider or GlanceAppWidget implementations, watch face complications, or full-screen Wear OS activities.
npx skill4agent add android/skills wear-widgetsandroidx.glance.wearGlanceWearWidgetGlanceWearWidgetServiceandroidx.compose.remote{GLANCE_WEAR_VERSION}androidx.glance.wear{COMPOSE_REMOTE_VERSION}androidx.compose.remote{WEAR_COMPOSE_REMOTE_VERSION}androidx.wear.compose.remote-alpha-beta-rc./gradlew dependenciescompileSdk = 37buildFeatures { compose = true }TileServiceMaterial3TileServiceGlanceWearWidget<service>app/src/main/AndroidManifest.xml@drawable/app/src/main/res/./gradlew :app:assembleDebugGlanceWearWidgetServiceapp/src/main/AndroidManifest.xmlBIND_TILE_PROVIDERBIND_WIDGET_PROVIDER<meta-data>@xml/<wearwidget-provider>SMALLLARGE<container>TileService<service
android:name=".snippets.widget.skill.MyWidgetService"
android:exported="true"
android:permission="com.google.android.wearable.permission.BIND_TILE_PROVIDER">
<intent-filter>
<action android:name="androidx.glance.wear.action.BIND_WIDGET_PROVIDER" />
</intent-filter>
<meta-data
android:name="androidx.glance.wear.widget.provider"
android:resource="@xml/my_widget_info" />
</service>GlanceWearWidgetprovideWidgetDataWearWidgetDocumentGlanceWearWidgetService@AssociateWithGlanceWearWidget// WRONG: Mobile GlanceAppWidget API (don't use on Wear OS)
class BrokenWidget : GlanceAppWidget() {
override suspend fun provideGlance(context: Context, id: GlanceId) {}
}
// CORRECT: Wear OS GlanceWearWidget + GlanceWearWidgetService
@AssociateWithGlanceWearWidget(MyWidget::class)
class MyWidgetService : GlanceWearWidgetService() {
override val widget: GlanceWearWidget = MyWidget()
}
class MyWidget : GlanceWearWidget() {
override suspend fun provideWidgetData(
context: Context,
params: WearWidgetParams,
): WearWidgetData =
WearWidgetDocument(
background = WearWidgetBrush.color(Color(0xFF1C1B1F).rc)
) {
MyWidgetContent(params = params)
}
}.rsRemoteString.rcRemoteColor.rdpRemoteDp.riRemoteIntRemoteInt.toRemoteStringparams.containerTypeContainerInfo.CONTAINER_TYPE_SMALLContainerInfo.CONTAINER_TYPE_LARGERemoteBoxRemoteModifier.fillMaxSizeRemoteImageRemoteImageBitmapbitmap.asImageBitmapcornerRadius = 0dpCircleShapeRoundedCornerShaperememberMutableRemoteIntvalueChange(state, newValue)mutableStateOfmutableIntStateOfpendingIntentAction { ctx -> ... }(Context) -> PendingIntentwidget.triggerUpdateAll(context)androidx.glance.wear.tooling.previewWearWidgetPreviewSquircleAllWidgetPreviewParamsRoundAllWidgetPreviewParamsRectangularAllWidgetPreviewParamsandroidx.glance.wear.tooling.previewandroidx.glance.wear.testing@PreviewWearWidgetPreview(widget, params)res/drawable-nodpi/RectangularAllWidgetPreviewParams320 dpi<container>SMALLCONTAINER_TYPE_SMALL448x168224x842.67LARGECONTAINER_TYPE_LARGE464x288232x1441.61| Capability or API surface | Reference guide |
|---|---|
| Widget service and manifest reference |
| Remote Compose layouts reference |
| State and actions reference |
| Previews and testing reference |
| Legacy or mobile API | Wear OS widget API | Action to take |
|---|---|---|
| | Replace service and annotate with |
| | Return |
| | Build layouts with |
| | Mutate remote state declaratively using |
| | Pass a |
| Symptom | Cause | Fix |
|---|---|---|
Unresolved reference | Missing | Set |
Unresolved reference | Imported | Remove the import; call |
Type mismatch on | Passed bare | Wrap in a lambda: |
Unresolved | Other classes or source sets in the module still use legacy tile APIs | Migrate or update the remaining references before removing legacy |
./gradlew :app:assembleDebugAndroidManifest.xml@xml/<wearwidget-provider>./gradlew :app:testDebugUnitTestGlanceAppWidgetAppWidgetProviderGlanceTileServiceTileServicemutableStateOfmutableIntStateOfPendingIntentpendingIntentAction(Context) -> PendingIntentCircleShapeRoundedCornerShape400x400com.google.android.wearable.permission.BIND_TILE_PROVIDERandroidx.glance.wear.action.BIND_WIDGET_PROVIDER<service>SMALLLARGE<container>@xml/448x168464x288res/drawable-nodpi/params.containerType@PreviewSquircleAllWidgetPreviewParamsRoundAllWidgetPreviewParams