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