1 /*
2  * Copyright 2021 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 androidx.compose.runtime.Composable
21 import androidx.compose.runtime.getValue
22 import androidx.compose.runtime.mutableStateOf
23 import androidx.compose.runtime.remember
24 import androidx.compose.runtime.setValue
25 import androidx.compose.ui.graphics.Color
26 import androidx.compose.ui.unit.dp
27 import androidx.compose.ui.unit.sp
28 import androidx.glance.GlanceId
29 import androidx.glance.GlanceModifier
30 import androidx.glance.appwidget.CheckBox
31 import androidx.glance.appwidget.CheckboxDefaults
32 import androidx.glance.appwidget.GlanceAppWidget
33 import androidx.glance.appwidget.GlanceAppWidgetReceiver
34 import androidx.glance.appwidget.RadioButton
35 import androidx.glance.appwidget.RadioButtonDefaults
36 import androidx.glance.appwidget.SizeMode
37 import androidx.glance.appwidget.Switch
38 import androidx.glance.appwidget.SwitchDefaults
39 import androidx.glance.appwidget.appWidgetBackground
40 import androidx.glance.appwidget.cornerRadius
41 import androidx.glance.appwidget.provideContent
42 import androidx.glance.appwidget.selectableGroup
43 import androidx.glance.background
44 import androidx.glance.color.ColorProvider
45 import androidx.glance.layout.Alignment
46 import androidx.glance.layout.Column
47 import androidx.glance.layout.Row
48 import androidx.glance.layout.fillMaxSize
49 import androidx.glance.layout.fillMaxWidth
50 import androidx.glance.layout.height
51 import androidx.glance.layout.padding
52 import androidx.glance.text.FontStyle
53 import androidx.glance.text.FontWeight
54 import androidx.glance.text.TextStyle
55 
56 class CompoundButtonAppWidget : GlanceAppWidget() {
57 
58     override val sizeMode: SizeMode = SizeMode.Exact
59 
provideGlancenull60     override suspend fun provideGlance(
61         context: Context,
62         id: GlanceId,
63     ) = provideContent { Content() }
64 
<lambda>null65     override suspend fun providePreview(context: Context, widgetCategory: Int) = provideContent {
66         Content()
67     }
68 
69     @Composable
Contentnull70     private fun Content() {
71         Column(
72             modifier =
73                 GlanceModifier.fillMaxSize()
74                     .background(Color.LightGray)
75                     .padding(R.dimen.external_padding)
76                     .cornerRadius(R.dimen.corner_radius)
77                     .appWidgetBackground(),
78             verticalAlignment = Alignment.Vertical.CenterVertically,
79             horizontalAlignment = Alignment.Horizontal.CenterHorizontally
80         ) {
81             val textStyle =
82                 TextStyle(
83                     color = ColorProvider(day = Color.Red, night = Color.Cyan),
84                     fontSize = 16.sp,
85                     fontWeight = FontWeight.Bold,
86                     fontStyle = FontStyle.Italic
87                 )
88             val fillModifier = GlanceModifier.fillMaxWidth()
89 
90             var checkbox1Checked by remember { mutableStateOf(false) }
91             var checkbox2Checked by remember { mutableStateOf(false) }
92             var checkbox3Checked by remember { mutableStateOf(false) }
93             var switch1Checked by remember { mutableStateOf(false) }
94             var switch2Checked by remember { mutableStateOf(false) }
95             @Suppress("AutoboxingStateCreation") var radioChecked by remember { mutableStateOf(0) }
96 
97             CheckBox(
98                 checked = checkbox1Checked,
99                 onCheckedChange = { checkbox1Checked = !checkbox1Checked },
100                 text = "Checkbox 1",
101                 modifier = GlanceModifier.height(56.dp).padding(bottom = 24.dp),
102             )
103             CheckBox(
104                 checked = checkbox2Checked,
105                 onCheckedChange = { checkbox2Checked = !checkbox2Checked },
106                 text = "Checkbox 2",
107                 style = textStyle,
108                 modifier = fillModifier,
109                 colors =
110                     CheckboxDefaults.colors(
111                         checkedColor = ColorProvider(day = Color.Red, night = Color.Cyan),
112                         uncheckedColor = ColorProvider(day = Color.Green, night = Color.Magenta)
113                     )
114             )
115             CheckBox(
116                 checked = checkbox3Checked,
117                 onCheckedChange = { checkbox3Checked = !checkbox2Checked },
118                 text = "Checkbox 3",
119             )
120             Switch(
121                 checked = switch1Checked,
122                 onCheckedChange = { switch1Checked = !switch1Checked },
123                 text = "Switch 1",
124                 colors =
125                     SwitchDefaults.colors(
126                         checkedThumbColor = ColorProvider(day = Color.Red, night = Color.Cyan),
127                         uncheckedThumbColor =
128                             ColorProvider(day = Color.Green, night = Color.Magenta),
129                         checkedTrackColor = ColorProvider(day = Color.Blue, night = Color.Yellow),
130                         uncheckedTrackColor =
131                             ColorProvider(day = Color.Magenta, night = Color.Green)
132                     ),
133             )
134             Switch(
135                 checked = switch2Checked,
136                 onCheckedChange = { switch2Checked = !switch2Checked },
137                 text = "Switch 2",
138                 style = textStyle,
139                 modifier = fillModifier
140             )
141             Column(modifier = fillModifier.selectableGroup()) {
142                 RadioButton(
143                     checked = radioChecked == 0,
144                     onClick = { radioChecked = 0 },
145                     text = "Radio 1",
146                     colors =
147                         RadioButtonDefaults.colors(
148                             checkedColor = ColorProvider(day = Color.Red, night = Color.Cyan),
149                             uncheckedColor = ColorProvider(day = Color.Green, night = Color.Magenta)
150                         ),
151                 )
152                 RadioButton(
153                     checked = radioChecked == 1,
154                     onClick = { radioChecked = 1 },
155                     text = "Radio 2",
156                     colors =
157                         RadioButtonDefaults.colors(
158                             checkedColor = ColorProvider(day = Color.Cyan, night = Color.Yellow),
159                             uncheckedColor = ColorProvider(day = Color.Red, night = Color.Blue)
160                         ),
161                 )
162                 RadioButton(
163                     checked = radioChecked == 2,
164                     onClick = { radioChecked = 2 },
165                     text = "Radio 3",
166                 )
167             }
168             Row(modifier = fillModifier.selectableGroup()) {
169                 RadioButton(
170                     checked = radioChecked == 0,
171                     onClick = null,
172                     text = "Radio 1",
173                 )
174                 RadioButton(
175                     checked = radioChecked == 1,
176                     onClick = null,
177                     text = "Radio 2",
178                 )
179                 RadioButton(
180                     checked = radioChecked == 2,
181                     onClick = null,
182                     text = "Radio 3",
183                 )
184             }
185         }
186     }
187 }
188 
189 class CompoundButtonAppWidgetReceiver : GlanceAppWidgetReceiver() {
190     override val glanceAppWidget = CompoundButtonAppWidget()
191 }
192