Skip to content

Commit 2b88c2c

Browse files
authored
Merge pull request #169 from bbade/main
[glance] Add canonical layout demo browser activity
2 parents b556c01 + 32a593e commit 2b88c2c

File tree

11 files changed

+342
-18
lines changed

11 files changed

+342
-18
lines changed

samples/user-interface/appwidgets/src/main/AndroidManifest.xml

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -99,6 +99,8 @@
9999
<!-- Action List -->
100100
<activity android:name=".glance.layout.ActionDemonstrationActivity" />
101101

102+
<activity android:name=".glance.layout.CanonicalLayoutActivity"/>
103+
102104
<receiver
103105
android:name=".glance.layout.collections.ActionListAppWidgetAppWidgetReceiver"
104106
android:enabled="@bool/glance_appwidget_available"

samples/user-interface/appwidgets/src/main/java/com/example/platform/ui/appwidgets/AppWidgets.kt

Lines changed: 35 additions & 18 deletions
Original file line numberDiff line numberDiff line change
@@ -33,6 +33,7 @@ import androidx.compose.foundation.layout.fillMaxWidth
3333
import androidx.compose.foundation.layout.padding
3434
import androidx.compose.foundation.lazy.LazyColumn
3535
import androidx.compose.foundation.lazy.items
36+
import androidx.compose.material3.Button
3637
import androidx.compose.material3.Card
3738
import androidx.compose.material3.ExperimentalMaterial3Api
3839
import androidx.compose.material3.MaterialTheme
@@ -43,13 +44,14 @@ import androidx.compose.ui.platform.LocalContext
4344
import androidx.compose.ui.res.painterResource
4445
import androidx.compose.ui.res.stringResource
4546
import androidx.compose.ui.unit.dp
47+
import com.example.platform.ui.appwidgets.glance.layout.CanonicalLayoutActivity
4648
import com.google.android.catalog.framework.annotations.Sample
4749

4850
@Sample(
4951
name = "App Widgets",
5052
description = "Showcases how to pin widget within the app. Check the launcher widget menu for all the app widgets samples",
5153
documentation = "https://developer.android.com/develop/ui/views/appwidgets/overview",
52-
tags = ["App Widgets"]
54+
tags = ["App Widgets"],
5355
)
5456
@RequiresApi(Build.VERSION_CODES.O)
5557
@Composable
@@ -59,7 +61,7 @@ fun AppWidgets() {
5961

6062
// Get a list of our app widget providers to retrieve their info
6163
val widgetProviders = widgetManager.getInstalledProvidersForPackage(context.packageName, null)
62-
.showCanonicalLayoutsFirst()
64+
.removeCanonicalLayouts()
6365

6466
AppWidgetsList(widgetProviders)
6567
}
@@ -69,11 +71,18 @@ fun AppWidgets() {
6971
fun AppWidgetsList(widgetProviders: List<AppWidgetProviderInfo>) {
7072
val context = LocalContext.current
7173
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+
) {
7378
item {
7479
AppInfoText()
7580
}
7681

82+
item {
83+
CanonicalLayoutsRow()
84+
}
85+
7786
// If the launcher does not support pinning request show a banner
7887
if (!widgetManager.isRequestPinAppWidgetSupported) {
7988
item {
@@ -87,16 +96,19 @@ fun AppWidgetsList(widgetProviders: List<AppWidgetProviderInfo>) {
8796
}
8897
}
8998

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")
97104
}
98105
}
99106

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+
100112

101113
/**
102114
* Extension method to request the launcher to pin the given AppWidgetProviderInfo
@@ -111,7 +123,7 @@ private fun AppWidgetProviderInfo.pin(context: Context) {
111123
context,
112124
0,
113125
Intent(context, AppWidgetPinnedReceiver::class.java),
114-
PendingIntent.FLAG_UPDATE_CURRENT or PendingIntent.FLAG_IMMUTABLE
126+
PendingIntent.FLAG_UPDATE_CURRENT or PendingIntent.FLAG_IMMUTABLE,
115127
)
116128

117129
AppWidgetManager.getInstance(context).requestPinAppWidget(provider, null, successCallback)
@@ -121,7 +133,7 @@ private fun AppWidgetProviderInfo.pin(context: Context) {
121133
private fun PinUnavailableBanner() {
122134
Text(
123135
text = stringResource(
124-
id = R.string.placeholder_app_widget_pin_unavailable
136+
id = R.string.placeholder_app_widget_pin_unavailable,
125137
),
126138
modifier = Modifier
127139
.fillMaxWidth()
@@ -134,7 +146,7 @@ private fun AppInfoText() {
134146
Text(
135147
text = stringResource(id = R.string.placeholder_app_widget),
136148
modifier = Modifier
137-
.fillMaxWidth()
149+
.fillMaxWidth(),
138150
)
139151
}
140152

@@ -150,7 +162,7 @@ private fun WidgetInfoCard(providerInfo: AppWidgetProviderInfo) {
150162
val context = LocalContext.current
151163
val label = providerInfo.loadLabel(context.packageManager)
152164
val description = if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.S) {
153-
(providerInfo.loadDescription(context)?:"").toString();
165+
(providerInfo.loadDescription(context) ?: "").toString();
154166
} else {
155167
"Description not available"
156168
}
@@ -160,17 +172,22 @@ private fun WidgetInfoCard(providerInfo: AppWidgetProviderInfo) {
160172
.fillMaxWidth(),
161173
onClick = {
162174
providerInfo.pin(context)
163-
}
175+
},
164176
) {
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+
) {
166183
Column(modifier = Modifier.padding(end = 8.dp)) {
167184
Text(
168185
text = label,
169-
style = MaterialTheme.typography.titleSmall
186+
style = MaterialTheme.typography.titleSmall,
170187
)
171188
Text(
172189
text = description,
173-
style = MaterialTheme.typography.bodyMedium
190+
style = MaterialTheme.typography.bodyMedium,
174191
)
175192
}
176193
Image(painter = preview, contentDescription = description)

0 commit comments

Comments
 (0)