1 /* 2 * Copyright 2023 The Android Open Source Project 3 * 4 * Licensed under the Apache License, Version 2.0 (the "License"); 5 * you may not use this file except in compliance with the License. 6 * You may obtain a copy of the License at 7 * 8 * http://www.apache.org/licenses/LICENSE-2.0 9 * 10 * Unless required by applicable law or agreed to in writing, software 11 * distributed under the License is distributed on an "AS IS" BASIS, 12 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 13 * See the License for the specific language governing permissions and 14 * limitations under the License. 15 */ 16 17 package androidx.glance.appwidget.demos 18 19 import android.content.Context 20 import android.widget.RemoteViews 21 import androidx.compose.runtime.Composable 22 import androidx.compose.ui.graphics.Color 23 import androidx.compose.ui.unit.dp 24 import androidx.glance.GlanceId 25 import androidx.glance.GlanceModifier 26 import androidx.glance.LocalContext 27 import androidx.glance.appwidget.AndroidRemoteViews 28 import androidx.glance.appwidget.GlanceAppWidget 29 import androidx.glance.appwidget.GlanceAppWidgetReceiver 30 import androidx.glance.appwidget.SizeMode 31 import androidx.glance.appwidget.cornerRadius 32 import androidx.glance.appwidget.provideContent 33 import androidx.glance.background 34 import androidx.glance.layout.Alignment 35 import androidx.glance.layout.Box 36 import androidx.glance.layout.Column 37 import androidx.glance.layout.fillMaxSize 38 import androidx.glance.layout.fillMaxWidth 39 import androidx.glance.layout.wrapContentHeight 40 import androidx.glance.layout.wrapContentSize 41 import androidx.glance.text.Text 42 43 /** Sample AppWidget that showcase the [AndroidRemoteViews] fallback composable. */ 44 class RemoteViewsWidget : GlanceAppWidget() { 45 override val sizeMode: SizeMode = SizeMode.Exact 46 <lambda>null47 override suspend fun provideGlance(context: Context, id: GlanceId) = provideContent { 48 Content() 49 } 50 <lambda>null51 override suspend fun providePreview(context: Context, widgetCategory: Int) = provideContent { 52 Content() 53 } 54 55 @Composable Contentnull56 private fun Content() { 57 Column( 58 modifier = GlanceModifier.fillMaxSize().background(Color.White), 59 horizontalAlignment = Alignment.Horizontal.CenterHorizontally 60 ) { 61 // Demonstrates a single item remote view layout 62 val remoteViews = 63 RemoteViews(LocalContext.current.packageName, R.layout.test_remote_views_single) 64 AndroidRemoteViews( 65 remoteViews = remoteViews, 66 modifier = 67 GlanceModifier.fillMaxWidth() 68 .wrapContentHeight() 69 .cornerRadius(16.dp) 70 .background(Color.Red) 71 ) 72 73 // Demonstrates a remote view layout being used as a container for regular glance 74 // composables 75 val flipper = 76 RemoteViews(LocalContext.current.packageName, R.layout.test_remote_views_multiple) 77 Text(text = "Container RemoteViews") 78 Box( 79 modifier = GlanceModifier.fillMaxWidth().defaultWeight(), 80 contentAlignment = Alignment.Center 81 ) { 82 AndroidRemoteViews( 83 remoteViews = flipper, 84 containerViewId = R.id.test_flipper_root, 85 modifier = GlanceModifier.wrapContentSize() 86 ) { 87 Text(text = "First") 88 Text(text = "Second") 89 } 90 } 91 } 92 } 93 } 94 95 class RemoteViewsWidgetReceiver : GlanceAppWidgetReceiver() { 96 override val glanceAppWidget: GlanceAppWidget = RemoteViewsWidget() 97 } 98