@@ -33,6 +33,7 @@ import androidx.compose.foundation.layout.fillMaxWidth
33
33
import androidx.compose.foundation.layout.padding
34
34
import androidx.compose.foundation.lazy.LazyColumn
35
35
import androidx.compose.foundation.lazy.items
36
+ import androidx.compose.material3.Button
36
37
import androidx.compose.material3.Card
37
38
import androidx.compose.material3.ExperimentalMaterial3Api
38
39
import androidx.compose.material3.MaterialTheme
@@ -43,13 +44,14 @@ import androidx.compose.ui.platform.LocalContext
43
44
import androidx.compose.ui.res.painterResource
44
45
import androidx.compose.ui.res.stringResource
45
46
import androidx.compose.ui.unit.dp
47
+ import com.example.platform.ui.appwidgets.glance.layout.CanonicalLayoutActivity
46
48
import com.google.android.catalog.framework.annotations.Sample
47
49
48
50
@Sample(
49
51
name = " App Widgets" ,
50
52
description = " Showcases how to pin widget within the app. Check the launcher widget menu for all the app widgets samples" ,
51
53
documentation = " https://developer.android.com/develop/ui/views/appwidgets/overview" ,
52
- tags = [" App Widgets" ]
54
+ tags = [" App Widgets" ],
53
55
)
54
56
@RequiresApi(Build .VERSION_CODES .O )
55
57
@Composable
@@ -59,7 +61,7 @@ fun AppWidgets() {
59
61
60
62
// Get a list of our app widget providers to retrieve their info
61
63
val widgetProviders = widgetManager.getInstalledProvidersForPackage(context.packageName, null )
62
- .showCanonicalLayoutsFirst ()
64
+ .removeCanonicalLayouts ()
63
65
64
66
AppWidgetsList (widgetProviders)
65
67
}
@@ -69,11 +71,18 @@ fun AppWidgets() {
69
71
fun AppWidgetsList (widgetProviders : List <AppWidgetProviderInfo >) {
70
72
val context = LocalContext .current
71
73
val widgetManager = AppWidgetManager .getInstance(context)
72
- LazyColumn (contentPadding = PaddingValues (16 .dp), verticalArrangement = Arrangement .spacedBy(16 .dp)) {
74
+ LazyColumn (
75
+ contentPadding = PaddingValues (16 .dp),
76
+ verticalArrangement = Arrangement .spacedBy(16 .dp),
77
+ ) {
73
78
item {
74
79
AppInfoText ()
75
80
}
76
81
82
+ item {
83
+ CanonicalLayoutsRow ()
84
+ }
85
+
77
86
// If the launcher does not support pinning request show a banner
78
87
if (! widgetManager.isRequestPinAppWidgetSupported) {
79
88
item {
@@ -87,16 +96,19 @@ fun AppWidgetsList(widgetProviders: List<AppWidgetProviderInfo>) {
87
96
}
88
97
}
89
98
90
- private fun MutableList<AppWidgetProviderInfo>.showCanonicalLayoutsFirst (): List <AppWidgetProviderInfo > {
91
- return this .toMutableList().apply {
92
- sortWith (
93
- compareBy {
94
- if (it.provider.className.startsWith(" com.example.platform.ui.appwidgets.glance.layout" )) - 1 else 1
95
- }
96
- )
99
+ @Composable
100
+ private fun CanonicalLayoutsRow () {
101
+ val context = LocalContext .current
102
+ Button (onClick = { CanonicalLayoutActivity .start(context) }) {
103
+ Text (" Canonical layout examples" )
97
104
}
98
105
}
99
106
107
+ private fun MutableList<AppWidgetProviderInfo>.removeCanonicalLayouts (): List <AppWidgetProviderInfo > {
108
+ return this .toMutableList()
109
+ .filter { ! it.provider.className.startsWith(" com.example.platform.ui.appwidgets.glance.layout" ) }
110
+ }
111
+
100
112
101
113
/* *
102
114
* Extension method to request the launcher to pin the given AppWidgetProviderInfo
@@ -111,7 +123,7 @@ private fun AppWidgetProviderInfo.pin(context: Context) {
111
123
context,
112
124
0 ,
113
125
Intent (context, AppWidgetPinnedReceiver ::class .java),
114
- PendingIntent .FLAG_UPDATE_CURRENT or PendingIntent .FLAG_IMMUTABLE
126
+ PendingIntent .FLAG_UPDATE_CURRENT or PendingIntent .FLAG_IMMUTABLE ,
115
127
)
116
128
117
129
AppWidgetManager .getInstance(context).requestPinAppWidget(provider, null , successCallback)
@@ -121,7 +133,7 @@ private fun AppWidgetProviderInfo.pin(context: Context) {
121
133
private fun PinUnavailableBanner () {
122
134
Text (
123
135
text = stringResource(
124
- id = R .string.placeholder_app_widget_pin_unavailable
136
+ id = R .string.placeholder_app_widget_pin_unavailable,
125
137
),
126
138
modifier = Modifier
127
139
.fillMaxWidth()
@@ -134,7 +146,7 @@ private fun AppInfoText() {
134
146
Text (
135
147
text = stringResource(id = R .string.placeholder_app_widget),
136
148
modifier = Modifier
137
- .fillMaxWidth()
149
+ .fillMaxWidth(),
138
150
)
139
151
}
140
152
@@ -150,7 +162,7 @@ private fun WidgetInfoCard(providerInfo: AppWidgetProviderInfo) {
150
162
val context = LocalContext .current
151
163
val label = providerInfo.loadLabel(context.packageManager)
152
164
val description = if (Build .VERSION .SDK_INT >= Build .VERSION_CODES .S ) {
153
- (providerInfo.loadDescription(context)? : " " ).toString();
165
+ (providerInfo.loadDescription(context) ? : " " ).toString();
154
166
} else {
155
167
" Description not available"
156
168
}
@@ -160,17 +172,22 @@ private fun WidgetInfoCard(providerInfo: AppWidgetProviderInfo) {
160
172
.fillMaxWidth(),
161
173
onClick = {
162
174
providerInfo.pin(context)
163
- }
175
+ },
164
176
) {
165
- Row (modifier = Modifier .fillMaxWidth().padding(16 .dp), horizontalArrangement = Arrangement .SpaceBetween ) {
177
+ Row (
178
+ modifier = Modifier
179
+ .fillMaxWidth()
180
+ .padding(16 .dp),
181
+ horizontalArrangement = Arrangement .SpaceBetween ,
182
+ ) {
166
183
Column (modifier = Modifier .padding(end = 8 .dp)) {
167
184
Text (
168
185
text = label,
169
- style = MaterialTheme .typography.titleSmall
186
+ style = MaterialTheme .typography.titleSmall,
170
187
)
171
188
Text (
172
189
text = description,
173
- style = MaterialTheme .typography.bodyMedium
190
+ style = MaterialTheme .typography.bodyMedium,
174
191
)
175
192
}
176
193
Image (painter = preview, contentDescription = description)
0 commit comments