Skip to content

Commit 44b83d9

Browse files
authored
Merge pull request #376 from alabiaga/main
live update permission toggle
2 parents 0484c49 + 862931b commit 44b83d9

File tree

4 files changed

+62
-11
lines changed

4 files changed

+62
-11
lines changed

app/src/main/AndroidManifest.xml

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -38,9 +38,12 @@
3838
android:theme="@style/Theme.PlatformSamples">
3939
<intent-filter>
4040
<action android:name="android.intent.action.MAIN" />
41-
4241
<category android:name="android.intent.category.LAUNCHER" />
4342
</intent-filter>
43+
<intent-filter>
44+
<action android:name="android.settings.APP_NOTIFICATION_PROMOTION_SETTINGS" />
45+
<category android:name="android.intent.category.DEFAULT" />
46+
</intent-filter>
4447
</activity>
4548

4649
<!--required for TFLite/LiteRT style transfer demo -->

samples/user-interface/live-updates/src/main/java/com/example/platform/ui/live_updates/LiveUpdateSample.kt

Lines changed: 51 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -19,7 +19,9 @@ package com.example.platform.ui.live_updates
1919
import android.annotation.SuppressLint
2020
import android.app.NotificationManager
2121
import android.content.Context
22+
import android.content.Intent
2223
import android.os.Build
24+
import android.provider.Settings
2325
import androidx.annotation.RequiresApi
2426
import androidx.compose.foundation.layout.Box
2527
import androidx.compose.foundation.layout.Column
@@ -35,13 +37,18 @@ import androidx.compose.material3.SnackbarHost
3537
import androidx.compose.material3.SnackbarHostState
3638
import androidx.compose.material3.Text
3739
import androidx.compose.runtime.Composable
40+
import androidx.compose.runtime.getValue
41+
import androidx.compose.runtime.mutableStateOf
3842
import androidx.compose.runtime.remember
3943
import androidx.compose.runtime.rememberCoroutineScope
44+
import androidx.compose.runtime.setValue
4045
import androidx.compose.ui.Alignment
4146
import androidx.compose.ui.Modifier
4247
import androidx.compose.ui.platform.LocalContext
4348
import androidx.compose.ui.res.stringResource
4449
import androidx.compose.ui.unit.dp
50+
import androidx.lifecycle.Lifecycle
51+
import androidx.lifecycle.compose.LifecycleEventEffect
4552
import com.google.accompanist.permissions.ExperimentalPermissionsApi
4653
import com.google.accompanist.permissions.isGranted
4754
import com.google.accompanist.permissions.rememberPermissionState
@@ -66,15 +73,19 @@ fun LiveUpdateSample() {
6673
.fillMaxSize()
6774
.padding(contentPadding),
6875
) {
76+
NotificationPermission()
77+
Spacer(modifier = Modifier.height(4.dp))
78+
NotificationPostPromotedPermission()
6979
Text(stringResource( R.string.live_update_summary_text))
7080
Spacer(modifier = Modifier.height(4.dp))
71-
NotificationPermission()
72-
Button(onClick = {
73-
onCheckout()
74-
scope.launch {
75-
snackbarHostState.showSnackbar("Order placed")
76-
}
77-
}) {
81+
Button(
82+
onClick = {
83+
onCheckout()
84+
scope.launch {
85+
snackbarHostState.showSnackbar("Order placed")
86+
}
87+
},
88+
) {
7889
Text("Checkout")
7990
}
8091
}
@@ -100,27 +111,57 @@ fun NotificationPermission() {
100111
notificationPermissionState.launchPermissionRequest()
101112
},
102113
modifier = Modifier
103-
.fillMaxWidth()
114+
.fillMaxWidth(),
115+
permissionStringResourceId = R.string.permission_message,
116+
permissionRationalStringResourceId = R.string.permission_rationale,
104117
)
105118
}
106119
}
107120

121+
@RequiresApi(Build.VERSION_CODES.BAKLAVA)
122+
@Composable
123+
fun NotificationPostPromotedPermission() {
124+
val context = LocalContext.current
125+
var isPostPromotionsEnabled by remember { mutableStateOf(SnackbarNotificationManager.isPostPromotionsEnabled()) }
126+
LifecycleEventEffect(Lifecycle.Event.ON_RESUME) {
127+
isPostPromotionsEnabled = SnackbarNotificationManager.isPostPromotionsEnabled()
128+
}
129+
if (!isPostPromotionsEnabled) {
130+
Text(
131+
text = stringResource(R.string.post_promoted_permission_message),
132+
modifier = Modifier.padding(horizontal = 10.dp),
133+
)
134+
Button(
135+
onClick = {
136+
val intent = Intent(Settings.ACTION_APP_NOTIFICATION_PROMOTION_SETTINGS).apply {
137+
putExtra(Settings.EXTRA_APP_PACKAGE, context.packageName)
138+
}
139+
context.startActivity(intent)
140+
},
141+
) {
142+
Text(text = stringResource(R.string.to_settings))
143+
}
144+
}
145+
}
146+
108147
@Composable
109148
private fun NotificationPermissionCard(
110149
shouldShowRationale: Boolean,
111150
onGrantClick: () -> Unit,
112151
modifier: Modifier = Modifier,
152+
permissionStringResourceId: Int,
153+
permissionRationalStringResourceId: Int,
113154
) {
114155
Card(
115156
modifier = modifier,
116157
) {
117158
Text(
118-
text = stringResource(R.string.permission_message),
159+
text = stringResource(permissionStringResourceId),
119160
modifier = Modifier.padding(16.dp),
120161
)
121162
if (shouldShowRationale) {
122163
Text(
123-
text = stringResource(R.string.permission_rationale),
164+
text = stringResource(permissionRationalStringResourceId),
124165
modifier = Modifier.padding(horizontal = 10.dp),
125166
)
126167
}

samples/user-interface/live-updates/src/main/java/com/example/platform/ui/live_updates/SnackbarNotificationManager.kt

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -258,4 +258,9 @@ object SnackbarNotificationManager {
258258
}, state.delay)
259259
}
260260
}
261+
262+
@RequiresApi(Build.VERSION_CODES.BAKLAVA)
263+
fun isPostPromotionsEnabled(): Boolean {
264+
return notificationManager.canPostPromotedNotifications()
265+
}
261266
}

samples/user-interface/live-updates/src/main/res/values/strings.xml

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -4,6 +4,8 @@
44
<string name="permission_grant">Grant</string>
55
<string name="permission_message">Please grant the notification permission.</string>
66
<string name="permission_rationale">Notifications are used for order tracking.</string>
7+
<string name="post_promoted_permission_message">Please grant the app the Live Updates notification permission as it is essential to experiencing an enhanced order tracking user experience.</string>
8+
<string name="to_settings">Go to settings</string>
79
<string name="live_update_summary_text">Clicking the checkout button will simulate the tracking of an order with notifications styled with ProgressStyle.</string>
810
<string name="checkout">Checkout</string>
911
<string name="checking_out">Order placed</string>

0 commit comments

Comments
 (0)