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