1+ package com.example.platform.ui.live_updates
2+
3+ import android.annotation.SuppressLint
4+ import android.app.NotificationManager
5+ import android.content.Context
6+ import android.os.Bundle
7+ import androidx.activity.enableEdgeToEdge
8+ import androidx.activity.ComponentActivity
9+ import androidx.activity.compose.setContent
10+ import androidx.compose.foundation.layout.Box
11+ import androidx.compose.foundation.layout.Column
12+ import androidx.compose.foundation.layout.Spacer
13+ import androidx.compose.foundation.layout.fillMaxSize
14+ import androidx.compose.foundation.layout.fillMaxWidth
15+ import androidx.compose.foundation.layout.height
16+ import androidx.compose.foundation.layout.padding
17+ import androidx.compose.material3.Button
18+ import androidx.compose.material3.Card
19+ import androidx.compose.material3.Scaffold
20+ import androidx.compose.material3.SnackbarHost
21+ import androidx.compose.material3.SnackbarHostState
22+ import androidx.compose.material3.Text
23+ import androidx.compose.runtime.Composable
24+ import androidx.compose.runtime.remember
25+ import androidx.compose.runtime.rememberCoroutineScope
26+ import androidx.compose.ui.Alignment
27+ import androidx.compose.ui.Modifier
28+ import androidx.compose.ui.res.stringResource
29+ import androidx.compose.ui.unit.dp
30+ import com.google.accompanist.permissions.ExperimentalPermissionsApi
31+ import com.google.accompanist.permissions.isGranted
32+ import com.google.accompanist.permissions.rememberPermissionState
33+ import com.google.accompanist.permissions.shouldShowRationale
34+ import kotlinx.coroutines.launch
35+
36+ class LiveUpdateActivity : ComponentActivity () {
37+ override fun onCreate (savedInstanceState : Bundle ? ) {
38+ super .onCreate(savedInstanceState)
39+ enableEdgeToEdge()
40+ val notificationManager =
41+ this .getSystemService(Context .NOTIFICATION_SERVICE ) as NotificationManager
42+ SnackbarNotificationManager .initialize(this , notificationManager)
43+ setContent {
44+ Initialize ()
45+ }
46+ }
47+ }
48+
49+ @Composable
50+ fun Initialize () {
51+ val scope = rememberCoroutineScope()
52+ val snackbarHostState = remember { SnackbarHostState () }
53+ Scaffold (
54+ snackbarHost = {
55+ SnackbarHost (hostState = snackbarHostState)
56+ },
57+ ) { contentPadding ->
58+ Column (
59+ modifier = Modifier
60+ .fillMaxSize()
61+ .padding(10 .dp, 100 .dp),
62+ ) {
63+ Text (stringResource( R .string.live_update_summary_text))
64+ Spacer (modifier = Modifier .height(4 .dp))
65+ NotificationPermission ()
66+ Button (onClick = {
67+ onCheckout()
68+ scope.launch {
69+ snackbarHostState.showSnackbar(" Order placed" )
70+ }
71+ }) {
72+ Text (" Checkout" )
73+ }
74+ }
75+ }
76+ }
77+
78+ fun onCheckout () {
79+ SnackbarNotificationManager .start()
80+ }
81+
82+ @OptIn(ExperimentalPermissionsApi ::class )
83+ @Composable
84+ fun NotificationPermission () {
85+ @SuppressLint(" InlinedApi" ) // Granted at install time on API <33.
86+ val notificationPermissionState = rememberPermissionState(
87+ android.Manifest .permission.POST_NOTIFICATIONS ,
88+ )
89+ if (! notificationPermissionState.status.isGranted) {
90+ NotificationPermissionCard (
91+ shouldShowRationale = notificationPermissionState.status.shouldShowRationale,
92+ onGrantClick = {
93+ notificationPermissionState.launchPermissionRequest()
94+ },
95+ modifier = Modifier
96+ .fillMaxWidth()
97+ )
98+ }
99+ }
100+
101+ @Composable
102+ private fun NotificationPermissionCard (
103+ shouldShowRationale : Boolean ,
104+ onGrantClick : () -> Unit ,
105+ modifier : Modifier = Modifier ,
106+ ) {
107+ Card (
108+ modifier = modifier,
109+ ) {
110+ Text (
111+ text = stringResource(R .string.permission_message),
112+ modifier = Modifier .padding(16 .dp),
113+ )
114+ if (shouldShowRationale) {
115+ Text (
116+ text = stringResource(R .string.permission_rationale),
117+ modifier = Modifier .padding(horizontal = 10 .dp),
118+ )
119+ }
120+ Box (
121+ modifier = Modifier
122+ .fillMaxWidth()
123+ .padding(10 .dp),
124+ contentAlignment = Alignment .BottomEnd ,
125+ ) {
126+ Button (onClick = onGrantClick) {
127+ Text (text = stringResource(R .string.permission_grant))
128+ }
129+ }
130+ }
131+ }
0 commit comments