<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