From 1c7c9133f2b54d75a688ca74231dc60dc031b530 Mon Sep 17 00:00:00 2001 From: Ash Nohe Date: Tue, 6 Oct 2026 17:49:55 +0000 Subject: [PATCH 1/3] Add boilerplate Remote Compose Android Pet widget - Add Remote Compose 1.0.0-alpha20 dependencies to libs.versions.toml and appwidgets module - Implement basic AndroidPetWidget using RemoteComposeWidget with centered RemoteText - Register AndroidPetWidget in AndroidManifest.xml and configure android_pet_widget_info.xml - Update overrideLibrary in app and appwidgets manifests for minSdk compatibility --- app/src/main/AndroidManifest.xml | 2 +- gradle/libs.versions.toml | 4 ++ .../appwidgets/build.gradle.kts | 5 ++ .../appwidgets/src/main/AndroidManifest.xml | 16 +++++ .../ui/appwidgets/widget/AndroidPetWidget.kt | 63 +++++++++++++++++++ .../src/main/res/values/strings.xml | 4 ++ .../main/res/xml/android_pet_widget_info.xml | 25 ++++++++ 7 files changed, 118 insertions(+), 1 deletion(-) create mode 100644 samples/user-interface/appwidgets/src/main/java/com/example/platform/ui/appwidgets/widget/AndroidPetWidget.kt create mode 100644 samples/user-interface/appwidgets/src/main/res/xml/android_pet_widget_info.xml diff --git a/app/src/main/AndroidManifest.xml b/app/src/main/AndroidManifest.xml index c9899e0e..2ef07273 100644 --- a/app/src/main/AndroidManifest.xml +++ b/app/src/main/AndroidManifest.xml @@ -23,7 +23,7 @@ Removing this would otherwise cause a Manifest merger issue. See https://developer.android.com/build/manage-manifests#merge_conflict_heuristics --> - + + + @@ -196,6 +198,20 @@ android:name="android.appwidget.provider" android:resource="@xml/app_widget_weather_forecast_glance" /> + + + + + + + + + \ No newline at end of file diff --git a/samples/user-interface/appwidgets/src/main/java/com/example/platform/ui/appwidgets/widget/AndroidPetWidget.kt b/samples/user-interface/appwidgets/src/main/java/com/example/platform/ui/appwidgets/widget/AndroidPetWidget.kt new file mode 100644 index 00000000..f1c4bbd8 --- /dev/null +++ b/samples/user-interface/appwidgets/src/main/java/com/example/platform/ui/appwidgets/widget/AndroidPetWidget.kt @@ -0,0 +1,63 @@ +/* + * Copyright 2026 The Android Open Source Project + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * https://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package com.example.platform.ui.appwidgets.widget + +import android.annotation.SuppressLint +import android.appwidget.AppWidgetManager +import android.content.Context +import androidx.compose.remote.creation.compose.layout.RemoteAlignment +import androidx.compose.remote.creation.compose.layout.RemoteBox +import androidx.compose.remote.creation.compose.layout.RemoteComposable +import androidx.compose.remote.creation.compose.layout.RemoteText +import androidx.compose.remote.creation.compose.modifier.RemoteModifier +import androidx.compose.remote.creation.compose.modifier.background +import androidx.compose.remote.creation.compose.modifier.fillMaxSize +import androidx.compose.remote.creation.compose.state.rc +import androidx.compose.remote.creation.compose.state.rs +import androidx.compose.remote.creation.compose.widgets.RemoteComposeWidget +import androidx.compose.runtime.Composable +import androidx.compose.ui.graphics.Color + +@SuppressLint("RestrictedApiAndroidX", "RestrictedApi") +class AndroidPetWidget : RemoteComposeWidget() { + + override fun onUpdate( + context: Context, + appWidgetManager: AppWidgetManager, + appWidgetIds: IntArray + ) { + super.onUpdate(context, appWidgetManager, appWidgetIds) + appWidgetIds.forEach { id -> + widget.updateRemoteView(context, appWidgetManager, this, id, -1) + } + } + + @SuppressLint("RestrictedApiAndroidX", "RestrictedApi") + @RemoteComposable + @Composable + override fun Content(context: Context, widgetId: Int) { + RemoteBox( + modifier = RemoteModifier.fillMaxSize().background(Color.White.rc), + contentAlignment = RemoteAlignment.Center + ) { + RemoteText( + text = "Android Pet".rs, + color = Color.Black.rc + ) + } + } +} diff --git a/samples/user-interface/appwidgets/src/main/res/values/strings.xml b/samples/user-interface/appwidgets/src/main/res/values/strings.xml index f15b4ea3..f3e72fac 100644 --- a/samples/user-interface/appwidgets/src/main/res/values/strings.xml +++ b/samples/user-interface/appwidgets/src/main/res/values/strings.xml @@ -25,6 +25,10 @@ Glance Weather Widget for weather forecast Mostly cloudy + + + Android Pet + An animated interactive pet widget powered by Remote Compose. LayoutSamples Settings diff --git a/samples/user-interface/appwidgets/src/main/res/xml/android_pet_widget_info.xml b/samples/user-interface/appwidgets/src/main/res/xml/android_pet_widget_info.xml new file mode 100644 index 00000000..a0f07dfa --- /dev/null +++ b/samples/user-interface/appwidgets/src/main/res/xml/android_pet_widget_info.xml @@ -0,0 +1,25 @@ + + + From 809f7c355690ac0c6c5aaf77115eccab70845940 Mon Sep 17 00:00:00 2001 From: Ash Nohe Date: Tue, 6 Oct 2026 19:30:30 +0000 Subject: [PATCH 2/3] Set initialLayout fallback message for Android Pet widget - Create android_pet_widget_fallback.xml layout showing Android 17+ requirement - Add android_pet_widget_fallback_message string - Update android_pet_widget_info.xml initialLayout to use the fallback layout --- .../layout/android_pet_widget_fallback.xml | 32 +++++++++++++++++++ .../src/main/res/values/strings.xml | 1 + .../main/res/xml/android_pet_widget_info.xml | 2 +- 3 files changed, 34 insertions(+), 1 deletion(-) create mode 100644 samples/user-interface/appwidgets/src/main/res/layout/android_pet_widget_fallback.xml diff --git a/samples/user-interface/appwidgets/src/main/res/layout/android_pet_widget_fallback.xml b/samples/user-interface/appwidgets/src/main/res/layout/android_pet_widget_fallback.xml new file mode 100644 index 00000000..457cb4b8 --- /dev/null +++ b/samples/user-interface/appwidgets/src/main/res/layout/android_pet_widget_fallback.xml @@ -0,0 +1,32 @@ + + + + + + diff --git a/samples/user-interface/appwidgets/src/main/res/values/strings.xml b/samples/user-interface/appwidgets/src/main/res/values/strings.xml index f3e72fac..b8af365a 100644 --- a/samples/user-interface/appwidgets/src/main/res/values/strings.xml +++ b/samples/user-interface/appwidgets/src/main/res/values/strings.xml @@ -29,6 +29,7 @@ Android Pet An animated interactive pet widget powered by Remote Compose. + Remote Compose widgets work on Android 17 and higher devices. Use an Android 17 device. LayoutSamples Settings diff --git a/samples/user-interface/appwidgets/src/main/res/xml/android_pet_widget_info.xml b/samples/user-interface/appwidgets/src/main/res/xml/android_pet_widget_info.xml index a0f07dfa..656d0ef7 100644 --- a/samples/user-interface/appwidgets/src/main/res/xml/android_pet_widget_info.xml +++ b/samples/user-interface/appwidgets/src/main/res/xml/android_pet_widget_info.xml @@ -16,7 +16,7 @@ --> Date: Tue, 6 Oct 2026 12:37:41 -0700 Subject: [PATCH 3/3] change package name and widget text --- .../user-interface/appwidgets/src/main/AndroidManifest.xml | 2 +- .../{widget => remote_compose}/AndroidPetWidget.kt | 7 +++++-- 2 files changed, 6 insertions(+), 3 deletions(-) rename samples/user-interface/appwidgets/src/main/java/com/example/platform/ui/appwidgets/{widget => remote_compose}/AndroidPetWidget.kt (91%) diff --git a/samples/user-interface/appwidgets/src/main/AndroidManifest.xml b/samples/user-interface/appwidgets/src/main/AndroidManifest.xml index f91acb74..245f88eb 100644 --- a/samples/user-interface/appwidgets/src/main/AndroidManifest.xml +++ b/samples/user-interface/appwidgets/src/main/AndroidManifest.xml @@ -201,7 +201,7 @@ diff --git a/samples/user-interface/appwidgets/src/main/java/com/example/platform/ui/appwidgets/widget/AndroidPetWidget.kt b/samples/user-interface/appwidgets/src/main/java/com/example/platform/ui/appwidgets/remote_compose/AndroidPetWidget.kt similarity index 91% rename from samples/user-interface/appwidgets/src/main/java/com/example/platform/ui/appwidgets/widget/AndroidPetWidget.kt rename to samples/user-interface/appwidgets/src/main/java/com/example/platform/ui/appwidgets/remote_compose/AndroidPetWidget.kt index f1c4bbd8..20025f33 100644 --- a/samples/user-interface/appwidgets/src/main/java/com/example/platform/ui/appwidgets/widget/AndroidPetWidget.kt +++ b/samples/user-interface/appwidgets/src/main/java/com/example/platform/ui/appwidgets/remote_compose/AndroidPetWidget.kt @@ -14,11 +14,13 @@ * limitations under the License. */ -package com.example.platform.ui.appwidgets.widget +package com.example.platform.ui.appwidgets.remote_compose import android.annotation.SuppressLint import android.appwidget.AppWidgetManager import android.content.Context +import android.os.Build +import androidx.annotation.RequiresApi import androidx.compose.remote.creation.compose.layout.RemoteAlignment import androidx.compose.remote.creation.compose.layout.RemoteBox import androidx.compose.remote.creation.compose.layout.RemoteComposable @@ -35,6 +37,7 @@ import androidx.compose.ui.graphics.Color @SuppressLint("RestrictedApiAndroidX", "RestrictedApi") class AndroidPetWidget : RemoteComposeWidget() { + @RequiresApi(Build.VERSION_CODES.VANILLA_ICE_CREAM) override fun onUpdate( context: Context, appWidgetManager: AppWidgetManager, @@ -55,7 +58,7 @@ class AndroidPetWidget : RemoteComposeWidget() { contentAlignment = RemoteAlignment.Center ) { RemoteText( - text = "Android Pet".rs, + text = "Android Pet Coming Soon".rs, color = Color.Black.rc ) }