Skip to content
This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.

Commit a413a12

Browse files
committedJan 31, 2023
Post notification permission for android 13
1 parent 02effd0 commit a413a12

File tree

4 files changed

+120
-3
lines changed

4 files changed

+120
-3
lines changed
 
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,15 @@
1+
package com.anafthdev.remindme.extension
2+
3+
import android.content.Context
4+
import android.content.Intent
5+
import android.net.Uri
6+
import android.provider.Settings
7+
8+
9+
fun Context.openSettings() {
10+
startActivity(
11+
Intent(Settings.ACTION_APPLICATION_DETAILS_SETTINGS).apply {
12+
data = Uri.fromParts("package", packageName, null)
13+
}
14+
)
15+
}

‎app/src/main/java/com/anafthdev/remindme/ui/main/MainScreen.kt

+90-1
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,8 @@
11
package com.anafthdev.remindme.ui.main
22

3+
import android.Manifest
4+
import android.content.pm.PackageManager
5+
import android.os.Build
36
import androidx.activity.compose.BackHandler
47
import androidx.compose.foundation.ExperimentalFoundationApi
58
import androidx.compose.foundation.border
@@ -22,30 +25,41 @@ import androidx.compose.foundation.lazy.itemsIndexed
2225
import androidx.compose.foundation.lazy.rememberLazyListState
2326
import androidx.compose.material.icons.Icons
2427
import androidx.compose.material.icons.rounded.Add
28+
import androidx.compose.material3.ExperimentalMaterial3Api
2529
import androidx.compose.material3.FilledTonalButton
2630
import androidx.compose.material3.FloatingActionButton
2731
import androidx.compose.material3.Icon
2832
import androidx.compose.material3.MaterialTheme
2933
import androidx.compose.material3.Switch
3034
import androidx.compose.material3.Text
3135
import androidx.compose.runtime.Composable
36+
import androidx.compose.runtime.DisposableEffect
3237
import androidx.compose.runtime.LaunchedEffect
38+
import androidx.compose.runtime.getValue
39+
import androidx.compose.runtime.mutableStateOf
40+
import androidx.compose.runtime.remember
41+
import androidx.compose.runtime.setValue
3342
import androidx.compose.ui.Alignment
3443
import androidx.compose.ui.Modifier
3544
import androidx.compose.ui.platform.LocalContext
3645
import androidx.compose.ui.platform.LocalFocusManager
46+
import androidx.compose.ui.platform.LocalLifecycleOwner
3747
import androidx.compose.ui.res.stringResource
3848
import androidx.compose.ui.text.style.TextAlign
3949
import androidx.compose.ui.unit.dp
4050
import androidx.compose.ui.zIndex
51+
import androidx.core.content.ContextCompat
4152
import androidx.hilt.navigation.compose.hiltViewModel
53+
import androidx.lifecycle.Lifecycle
54+
import androidx.lifecycle.LifecycleEventObserver
4255
import androidx.window.layout.DisplayFeature
4356
import com.anafthdev.remindme.R
4457
import com.anafthdev.remindme.data.RemindMeRoute
4558
import com.anafthdev.remindme.data.RemindMeTopLevelDestination
4659
import com.anafthdev.remindme.data.RemindMeTopLevelDestinations
4760
import com.anafthdev.remindme.data.ReminderMessageType
4861
import com.anafthdev.remindme.data.model.Reminder
62+
import com.anafthdev.remindme.extension.openSettings
4963
import com.anafthdev.remindme.extension.toast
5064
import com.anafthdev.remindme.ui.remind_me.RemindMeUiState
5165
import com.anafthdev.remindme.ui.reminder_detail.ReminderDetailScreen
@@ -57,6 +71,9 @@ import com.anafthdev.remindme.uicomponent.ReminderMessageItem
5771
import com.anafthdev.remindme.utils.RemindMeContentType
5872
import com.google.accompanist.adaptive.HorizontalTwoPaneStrategy
5973
import com.google.accompanist.adaptive.TwoPane
74+
import com.google.accompanist.permissions.ExperimentalPermissionsApi
75+
import com.google.accompanist.permissions.isGranted
76+
import com.google.accompanist.permissions.rememberPermissionState
6077

6178
@Composable
6279
fun MainScreen(
@@ -160,6 +177,7 @@ fun RemindMeSinglePaneContent(
160177
}
161178
}
162179

180+
@OptIn(ExperimentalMaterial3Api::class, ExperimentalPermissionsApi::class)
163181
@Composable
164182
fun RemindMeReminderList(
165183
is24Hour: Boolean,
@@ -172,6 +190,50 @@ fun RemindMeReminderList(
172190
updateReminder: (Reminder) -> Unit
173191
) {
174192

193+
val context = LocalContext.current
194+
val lifecycleOwner = LocalLifecycleOwner.current
195+
196+
var permissionRequested by remember { mutableStateOf(false) }
197+
198+
var postNotificationGranted by remember {
199+
mutableStateOf(
200+
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.TIRAMISU) {
201+
ContextCompat.checkSelfPermission(context, Manifest.permission.POST_NOTIFICATIONS) == PackageManager.PERMISSION_GRANTED
202+
} else true
203+
)
204+
}
205+
206+
val postNotificationPermission = rememberPermissionState(
207+
permission = Manifest.permission.POST_NOTIFICATIONS,
208+
onPermissionResult = { granted ->
209+
postNotificationGranted = granted
210+
211+
if (!granted) {
212+
permissionRequested = true
213+
}
214+
}
215+
)
216+
217+
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.TIRAMISU) {
218+
DisposableEffect(lifecycleOwner) {
219+
// Create an observer that triggers our remembered callbacks
220+
// for sending analytics events
221+
val observer = LifecycleEventObserver { _, event ->
222+
if (event == Lifecycle.Event.ON_START) {
223+
postNotificationGranted = ContextCompat.checkSelfPermission(context, Manifest.permission.POST_NOTIFICATIONS) == PackageManager.PERMISSION_GRANTED
224+
}
225+
}
226+
227+
// Add the observer to the lifecycle
228+
lifecycleOwner.lifecycle.addObserver(observer)
229+
230+
// When the effect leaves the Composition, remove the observer
231+
onDispose {
232+
lifecycleOwner.lifecycle.removeObserver(observer)
233+
}
234+
}
235+
}
236+
175237
Box(modifier = modifier) {
176238
if (contentType == RemindMeContentType.SINGLE_PANE) {
177239
FloatingActionButton(
@@ -207,21 +269,48 @@ fun RemindMeReminderList(
207269
)
208270
}
209271

272+
if (!postNotificationGranted) {
273+
item {
274+
FilledTonalButton(
275+
onClick = {
276+
when {
277+
!permissionRequested && !postNotificationPermission.status.isGranted -> {
278+
postNotificationPermission.launchPermissionRequest()
279+
}
280+
// postNotificationPermission.status.shouldShowRationale -> {}
281+
else -> {
282+
context.openSettings()
283+
}
284+
}
285+
},
286+
modifier = Modifier
287+
.padding(horizontal = 8.dp)
288+
.fillMaxWidth()
289+
) {
290+
Text(
291+
text = stringResource(id = R.string.grant_post_notification_permission)
292+
)
293+
}
294+
}
295+
}
296+
210297
items(
211298
items = reminders,
212299
key = { item: Reminder -> item.id }
213300
) { reminder ->
214301
ReminderItem(
215302
reminder = reminder,
216303
is24Hour = is24Hour,
304+
enabled = postNotificationGranted,
217305
onClick = {
218306
navigateToReminder(reminder.id, contentType) },
219307
onCheckedChange = { isActive ->
220308
updateReminder(
221309
reminder.copy(
222310
isActive = isActive
223311
)
224-
) },
312+
)
313+
},
225314
modifier = Modifier
226315
.padding(8.dp)
227316
.fillMaxWidth()

‎app/src/main/java/com/anafthdev/remindme/uicomponent/ReminderItem.kt

+14-2
Original file line numberDiff line numberDiff line change
@@ -3,10 +3,20 @@ package com.anafthdev.remindme.uicomponent
33
import androidx.compose.foundation.ExperimentalFoundationApi
44
import androidx.compose.foundation.LocalIndication
55
import androidx.compose.foundation.LocalOverscrollConfiguration
6-
import androidx.compose.foundation.layout.*
6+
import androidx.compose.foundation.layout.BoxWithConstraints
7+
import androidx.compose.foundation.layout.Row
8+
import androidx.compose.foundation.layout.Spacer
9+
import androidx.compose.foundation.layout.padding
10+
import androidx.compose.foundation.layout.width
11+
import androidx.compose.foundation.layout.widthIn
712
import androidx.compose.foundation.lazy.LazyRow
813
import androidx.compose.foundation.lazy.items
9-
import androidx.compose.material3.*
14+
import androidx.compose.material3.Card
15+
import androidx.compose.material3.ExperimentalMaterial3Api
16+
import androidx.compose.material3.FilterChip
17+
import androidx.compose.material3.MaterialTheme
18+
import androidx.compose.material3.Switch
19+
import androidx.compose.material3.Text
1020
import androidx.compose.runtime.Composable
1121
import androidx.compose.runtime.CompositionLocalProvider
1222
import androidx.compose.runtime.remember
@@ -30,6 +40,7 @@ fun ReminderItem(
3040
reminder: Reminder,
3141
is24Hour: Boolean,
3242
modifier: Modifier = Modifier,
43+
enabled: Boolean = true,
3344
onClick: () -> Unit,
3445
onCheckedChange: (Boolean) -> Unit
3546
) {
@@ -74,6 +85,7 @@ fun ReminderItem(
7485
Spacer(modifier = Modifier.weight(1f))
7586

7687
Switch(
88+
enabled = enabled,
7789
checked = reminder.isActive,
7890
onCheckedChange = onCheckedChange
7991
)

‎app/src/main/res/values/strings.xml

+1
Original file line numberDiff line numberDiff line change
@@ -35,4 +35,5 @@
3535
<string name="info">Info</string>
3636
<string name="app_info">App info</string>
3737
<string name="source_code">Source code</string>
38+
<string name="grant_post_notification_permission">Grant post notification permission</string>
3839
</resources>

0 commit comments

Comments
 (0)
Please sign in to comment.