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