From e379d0efb3d1a739b562f4d1b34d3585447bfd1c Mon Sep 17 00:00:00 2001 From: Aaron Labiaga Date: Thu, 16 Oct 2025 17:39:33 -0600 Subject: [PATCH 1/3] add toggle/message for enabling live update notification permission in settings Change-Id: I822f4d1d8ad1b347ed53420fe3c8404958261d49 --- app/src/main/AndroidManifest.xml | 5 +- .../ui/live_updates/LiveUpdateSample.kt | 60 +++++++++++++++---- .../src/main/res/values/strings.xml | 2 + 3 files changed, 56 insertions(+), 11 deletions(-) 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..43f5a996 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,6 +37,7 @@ import androidx.compose.material3.SnackbarHost import androidx.compose.material3.SnackbarHostState import androidx.compose.material3.Text import androidx.compose.runtime.Composable +import androidx.compose.runtime.mutableStateOf import androidx.compose.runtime.remember import androidx.compose.runtime.rememberCoroutineScope import androidx.compose.ui.Alignment @@ -42,6 +45,8 @@ 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 +71,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 +109,58 @@ 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 + val isPostPromotionsEnabled = remember { mutableStateOf(SnackbarNotificationManager.isPostPromotionsEnabled()) } + LifecycleEventEffect(Lifecycle.Event.ON_RESUME) { + isPostPromotionsEnabled.value = SnackbarNotificationManager.isPostPromotionsEnabled() + } + if (!isPostPromotionsEnabled.value) { + 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 { + flags = Intent.FLAG_ACTIVITY_NEW_TASK + 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/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 From fbe54a2ffa757ff31d7caeb93d789f99de5b0439 Mon Sep 17 00:00:00 2001 From: Aaron Labiaga Date: Thu, 16 Oct 2025 17:41:28 -0600 Subject: [PATCH 2/3] live update permission changes Change-Id: Iaf5acbaffa2d098f1833a99a35e9052cb5f5b769 --- .../platform/ui/live_updates/SnackbarNotificationManager.kt | 5 +++++ 1 file changed, 5 insertions(+) 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..95e33c8c 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() + } } From 862931b4751e3135eaf8c20c4561f0ad2628c7e0 Mon Sep 17 00:00:00 2001 From: Aaron Labiaga Date: Thu, 16 Oct 2025 17:53:50 -0600 Subject: [PATCH 3/3] fix gemini suggestions Change-Id: I2db246e697aa54aebba466ae96cb1b5321b7ec72 --- .../example/platform/ui/live_updates/LiveUpdateSample.kt | 9 +++++---- .../ui/live_updates/SnackbarNotificationManager.kt | 2 +- 2 files changed, 6 insertions(+), 5 deletions(-) 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 43f5a996..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 @@ -37,9 +37,11 @@ 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 @@ -120,11 +122,11 @@ fun NotificationPermission() { @Composable fun NotificationPostPromotedPermission() { val context = LocalContext.current - val isPostPromotionsEnabled = remember { mutableStateOf(SnackbarNotificationManager.isPostPromotionsEnabled()) } + var isPostPromotionsEnabled by remember { mutableStateOf(SnackbarNotificationManager.isPostPromotionsEnabled()) } LifecycleEventEffect(Lifecycle.Event.ON_RESUME) { - isPostPromotionsEnabled.value = SnackbarNotificationManager.isPostPromotionsEnabled() + isPostPromotionsEnabled = SnackbarNotificationManager.isPostPromotionsEnabled() } - if (!isPostPromotionsEnabled.value) { + if (!isPostPromotionsEnabled) { Text( text = stringResource(R.string.post_promoted_permission_message), modifier = Modifier.padding(horizontal = 10.dp), @@ -132,7 +134,6 @@ fun NotificationPostPromotedPermission() { Button( onClick = { val intent = Intent(Settings.ACTION_APP_NOTIFICATION_PROMOTION_SETTINGS).apply { - flags = Intent.FLAG_ACTIVITY_NEW_TASK putExtra(Settings.EXTRA_APP_PACKAGE, context.packageName) } context.startActivity(intent) 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 95e33c8c..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 @@ -261,6 +261,6 @@ object SnackbarNotificationManager { @RequiresApi(Build.VERSION_CODES.BAKLAVA) fun isPostPromotionsEnabled(): Boolean { - return notificationManager.canPostPromotedNotifications() + return notificationManager.canPostPromotedNotifications() } }