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