<lambda>null1 package androidx.glance.appwidget.demos
2 
3 import android.content.Context
4 import androidx.compose.runtime.Composable
5 import androidx.compose.ui.unit.dp
6 import androidx.datastore.preferences.core.intPreferencesKey
7 import androidx.glance.Button
8 import androidx.glance.GlanceId
9 import androidx.glance.GlanceModifier
10 import androidx.glance.action.ActionParameters
11 import androidx.glance.action.actionParametersOf
12 import androidx.glance.appwidget.GlanceAppWidget
13 import androidx.glance.appwidget.GlanceAppWidgetReceiver
14 import androidx.glance.appwidget.action.ActionCallback
15 import androidx.glance.appwidget.action.actionRunCallback
16 import androidx.glance.appwidget.appWidgetBackground
17 import androidx.glance.appwidget.provideContent
18 import androidx.glance.appwidget.state.updateAppWidgetState
19 import androidx.glance.background
20 import androidx.glance.currentState
21 import androidx.glance.layout.Alignment
22 import androidx.glance.layout.Row
23 import androidx.glance.layout.fillMaxSize
24 import androidx.glance.layout.padding
25 import androidx.glance.text.Text
26 import androidx.glance.text.TextAlign
27 import androidx.glance.text.TextStyle
28 
29 // Defines a state key for [currentState]
30 private val CountClicksKey = intPreferencesKey("CountClicks")
31 
32 // Defines an action key for [actionRunCallback]
33 private val ClickValueKey = ActionParameters.Key<Int>("ClickValue")
34 
35 // Showcases a simple widget that uses the default [stateDefinition] of [GlanceAppWidget] to store
36 // the +/- clicks values.
37 class DefaultStateAppWidget : GlanceAppWidget() {
38 
39     override suspend fun provideGlance(context: Context, id: GlanceId) = provideContent {
40         // Get the current stored value for the given Key.
41         val count = currentState(CountClicksKey) ?: 0
42         Content(count)
43     }
44 
45     override suspend fun providePreview(context: Context, widgetCategory: Int) {
46         provideContent { Content(count = 1) }
47     }
48 
49     @Composable
50     private fun Content(count: Int) {
51         Row(
52             modifier =
53                 GlanceModifier.fillMaxSize()
54                     .appWidgetBackground()
55                     .padding(16.dp)
56                     .background(R.color.default_widget_background),
57             verticalAlignment = Alignment.CenterVertically
58         ) {
59             Button(
60                 modifier = GlanceModifier.defaultWeight(),
61                 text = "-",
62                 style = TextStyle(textAlign = TextAlign.Center),
63                 onClick = actionRunCallback<ClickAction>(actionParametersOf(ClickValueKey to -1))
64             )
65             Text(
66                 modifier = GlanceModifier.defaultWeight(),
67                 text = "$count",
68                 style = TextStyle(textAlign = TextAlign.Center)
69             )
70             Button(
71                 modifier = GlanceModifier.defaultWeight(),
72                 text = "+",
73                 style = TextStyle(textAlign = TextAlign.Center),
74                 onClick = actionRunCallback<ClickAction>(actionParametersOf(ClickValueKey to 1))
75             )
76         }
77     }
78 }
79 
80 class ClickAction : ActionCallback {
onActionnull81     override suspend fun onAction(
82         context: Context,
83         glanceId: GlanceId,
84         parameters: ActionParameters
85     ) {
86         // Get the current state of the given widget and the value provided in the ActionParameters
87         updateAppWidgetState(context, glanceId) { state ->
88             state[CountClicksKey] = (state[CountClicksKey] ?: 0) + (parameters[ClickValueKey] ?: 0)
89         }
90         // Trigger the widget update
91         DefaultStateAppWidget().update(context, glanceId)
92     }
93 }
94 
95 class DefaultStateAppWidgetReceiver : GlanceAppWidgetReceiver() {
96     override val glanceAppWidget: GlanceAppWidget = DefaultStateAppWidget()
97 }
98