diff --git a/app/src/main/AndroidManifest.xml b/app/src/main/AndroidManifest.xml
index fda00d8a..c9899e0e 100644
--- a/app/src/main/AndroidManifest.xml
+++ b/app/src/main/AndroidManifest.xml
@@ -38,9 +38,12 @@
android:theme="@style/Theme.PlatformSamples">
-
+
+
+
+
diff --git a/samples/user-interface/live-updates/src/main/java/com/example/platform/ui/live_updates/LiveUpdateSample.kt b/samples/user-interface/live-updates/src/main/java/com/example/platform/ui/live_updates/LiveUpdateSample.kt
index a0f6634a..9afb9f81 100644
--- a/samples/user-interface/live-updates/src/main/java/com/example/platform/ui/live_updates/LiveUpdateSample.kt
+++ b/samples/user-interface/live-updates/src/main/java/com/example/platform/ui/live_updates/LiveUpdateSample.kt
@@ -19,7 +19,9 @@ package com.example.platform.ui.live_updates
import android.annotation.SuppressLint
import android.app.NotificationManager
import android.content.Context
+import android.content.Intent
import android.os.Build
+import android.provider.Settings
import androidx.annotation.RequiresApi
import androidx.compose.foundation.layout.Box
import androidx.compose.foundation.layout.Column
@@ -35,13 +37,18 @@ import androidx.compose.material3.SnackbarHost
import androidx.compose.material3.SnackbarHostState
import androidx.compose.material3.Text
import androidx.compose.runtime.Composable
+import androidx.compose.runtime.getValue
+import androidx.compose.runtime.mutableStateOf
import androidx.compose.runtime.remember
import androidx.compose.runtime.rememberCoroutineScope
+import androidx.compose.runtime.setValue
import androidx.compose.ui.Alignment
import androidx.compose.ui.Modifier
import androidx.compose.ui.platform.LocalContext
import androidx.compose.ui.res.stringResource
import androidx.compose.ui.unit.dp
+import androidx.lifecycle.Lifecycle
+import androidx.lifecycle.compose.LifecycleEventEffect
import com.google.accompanist.permissions.ExperimentalPermissionsApi
import com.google.accompanist.permissions.isGranted
import com.google.accompanist.permissions.rememberPermissionState
@@ -66,15 +73,19 @@ fun LiveUpdateSample() {
.fillMaxSize()
.padding(contentPadding),
) {
+ NotificationPermission()
+ Spacer(modifier = Modifier.height(4.dp))
+ NotificationPostPromotedPermission()
Text(stringResource( R.string.live_update_summary_text))
Spacer(modifier = Modifier.height(4.dp))
- NotificationPermission()
- Button(onClick = {
- onCheckout()
- scope.launch {
- snackbarHostState.showSnackbar("Order placed")
- }
- }) {
+ Button(
+ onClick = {
+ onCheckout()
+ scope.launch {
+ snackbarHostState.showSnackbar("Order placed")
+ }
+ },
+ ) {
Text("Checkout")
}
}
@@ -100,27 +111,57 @@ fun NotificationPermission() {
notificationPermissionState.launchPermissionRequest()
},
modifier = Modifier
- .fillMaxWidth()
+ .fillMaxWidth(),
+ permissionStringResourceId = R.string.permission_message,
+ permissionRationalStringResourceId = R.string.permission_rationale,
)
}
}
+@RequiresApi(Build.VERSION_CODES.BAKLAVA)
+@Composable
+fun NotificationPostPromotedPermission() {
+ val context = LocalContext.current
+ var isPostPromotionsEnabled by remember { mutableStateOf(SnackbarNotificationManager.isPostPromotionsEnabled()) }
+ LifecycleEventEffect(Lifecycle.Event.ON_RESUME) {
+ isPostPromotionsEnabled = SnackbarNotificationManager.isPostPromotionsEnabled()
+ }
+ if (!isPostPromotionsEnabled) {
+ Text(
+ text = stringResource(R.string.post_promoted_permission_message),
+ modifier = Modifier.padding(horizontal = 10.dp),
+ )
+ Button(
+ onClick = {
+ val intent = Intent(Settings.ACTION_APP_NOTIFICATION_PROMOTION_SETTINGS).apply {
+ putExtra(Settings.EXTRA_APP_PACKAGE, context.packageName)
+ }
+ context.startActivity(intent)
+ },
+ ) {
+ Text(text = stringResource(R.string.to_settings))
+ }
+ }
+}
+
@Composable
private fun NotificationPermissionCard(
shouldShowRationale: Boolean,
onGrantClick: () -> Unit,
modifier: Modifier = Modifier,
+ permissionStringResourceId: Int,
+ permissionRationalStringResourceId: Int,
) {
Card(
modifier = modifier,
) {
Text(
- text = stringResource(R.string.permission_message),
+ text = stringResource(permissionStringResourceId),
modifier = Modifier.padding(16.dp),
)
if (shouldShowRationale) {
Text(
- text = stringResource(R.string.permission_rationale),
+ text = stringResource(permissionRationalStringResourceId),
modifier = Modifier.padding(horizontal = 10.dp),
)
}
diff --git a/samples/user-interface/live-updates/src/main/java/com/example/platform/ui/live_updates/SnackbarNotificationManager.kt b/samples/user-interface/live-updates/src/main/java/com/example/platform/ui/live_updates/SnackbarNotificationManager.kt
index 6071f083..56c45217 100644
--- a/samples/user-interface/live-updates/src/main/java/com/example/platform/ui/live_updates/SnackbarNotificationManager.kt
+++ b/samples/user-interface/live-updates/src/main/java/com/example/platform/ui/live_updates/SnackbarNotificationManager.kt
@@ -258,4 +258,9 @@ object SnackbarNotificationManager {
}, state.delay)
}
}
+
+ @RequiresApi(Build.VERSION_CODES.BAKLAVA)
+ fun isPostPromotionsEnabled(): Boolean {
+ return notificationManager.canPostPromotedNotifications()
+ }
}
diff --git a/samples/user-interface/live-updates/src/main/res/values/strings.xml b/samples/user-interface/live-updates/src/main/res/values/strings.xml
index 9ee41a09..1d245082 100644
--- a/samples/user-interface/live-updates/src/main/res/values/strings.xml
+++ b/samples/user-interface/live-updates/src/main/res/values/strings.xml
@@ -4,6 +4,8 @@
Grant
Please grant the notification permission.
Notifications are used for order tracking.
+ Please grant the app the Live Updates notification permission as it is essential to experiencing an enhanced order tracking user experience.
+ Go to settings
Clicking the checkout button will simulate the tracking of an order with notifications styled with ProgressStyle.
Checkout
Order placed