diff --git a/feature/auth/src/main/java/com/puzzle/auth/graph/signup/page/AccessRightsPage.kt b/feature/auth/src/main/java/com/puzzle/auth/graph/signup/page/AccessRightsPage.kt index 3419ff07e..2d954c27e 100644 --- a/feature/auth/src/main/java/com/puzzle/auth/graph/signup/page/AccessRightsPage.kt +++ b/feature/auth/src/main/java/com/puzzle/auth/graph/signup/page/AccessRightsPage.kt @@ -29,6 +29,8 @@ import androidx.compose.foundation.layout.size import androidx.compose.material3.Text import androidx.compose.runtime.Composable import androidx.compose.runtime.LaunchedEffect +import androidx.compose.runtime.getValue +import androidx.compose.runtime.remember import androidx.compose.ui.Alignment import androidx.compose.ui.Modifier import androidx.compose.ui.platform.LocalContext @@ -39,6 +41,9 @@ import androidx.compose.ui.text.buildAnnotatedString import androidx.compose.ui.text.withStyle import androidx.compose.ui.tooling.preview.Preview import androidx.compose.ui.unit.dp +import androidx.core.app.NotificationManagerCompat +import androidx.lifecycle.compose.LocalLifecycleOwner +import androidx.lifecycle.compose.collectAsStateWithLifecycle import com.google.accompanist.permissions.ExperimentalPermissionsApi import com.google.accompanist.permissions.PermissionState import com.google.accompanist.permissions.PermissionStatus @@ -59,6 +64,10 @@ internal fun ColumnScope.AccessRightsPage( onDisEnabledButtonClick: () -> Unit, ) { val context = LocalContext.current + + val lifecycleOwner = LocalLifecycleOwner.current + val lifecycleState by lifecycleOwner.lifecycle.currentStateFlow.collectAsStateWithLifecycle() + val permissionList = rememberMultiplePermissionsState( listOfNotNull( when { @@ -70,6 +79,7 @@ internal fun ColumnScope.AccessRightsPage( READ_CONTACTS ) ) + val galleryPermission = permissionList.permissions .find { it.permission in when { @@ -78,15 +88,28 @@ internal fun ColumnScope.AccessRightsPage( else -> setOf(READ_MEDIA_IMAGES, READ_MEDIA_VISUAL_USER_SELECTED) } } - val notificationPermission = permissionList.permissions - .find { if (SDK_INT >= TIRAMISU) it.permission == POST_NOTIFICATIONS else true } + + val notificationPermission = if (SDK_INT >= TIRAMISU) { + permissionList.permissions.find { it.permission == POST_NOTIFICATIONS } + } else null + val contactsPermission = permissionList.permissions .find { it.permission == READ_CONTACTS } BackHandler { onBackClick() } - LaunchedEffect(permissionList) { - permissionList.launchMultiplePermissionRequest() + val isNotificationGranted = remember( + lifecycleState, + notificationPermission?.status + ) { + NotificationManagerCompat.from(context).areNotificationsEnabled() + } + + LaunchedEffect(Unit) { + val hasDenied = permissionList.permissions.any { it.status != PermissionStatus.Granted } + if (hasDenied) { + permissionList.launchMultiplePermissionRequest() + } } PieceSubBackTopBar( @@ -128,8 +151,14 @@ internal fun ColumnScope.AccessRightsPage( icon = R.drawable.ic_permission_alarm, label = stringResource(R.string.permission_notification), description = stringResource(R.string.permission_notification_description), - checked = notificationPermission?.status == PermissionStatus.Granted, - onCheckedChange = { handlePermission(context, notificationPermission) }, + checked = isNotificationGranted, + onCheckedChange = { + if (SDK_INT >= TIRAMISU) { + handlePermission(context, notificationPermission) + } else { + navigateToAppSettings(context) + } + }, ) PiecePermissionRow( @@ -222,16 +251,21 @@ private fun PiecePermissionRow( internal fun handlePermission(context: Context, permission: PermissionState?) { permission?.let { if (it.status == PermissionStatus.Granted || !it.status.shouldShowRationale) { - val intent = Intent(Settings.ACTION_APPLICATION_DETAILS_SETTINGS).apply { - data = Uri.fromParts("package", context.packageName, null) - } - context.startActivity(intent) + navigateToAppSettings(context) } else { it.launchPermissionRequest() } } } +private fun navigateToAppSettings(context: Context) { + context.startActivity( + Intent(Settings.ACTION_APPLICATION_DETAILS_SETTINGS).apply { + data = Uri.fromParts("package", context.packageName, null) + } + ) +} + @Preview @Composable private fun AccessRightsPagePreview() { diff --git a/feature/setting/src/main/java/com/puzzle/setting/graph/main/SettingScreen.kt b/feature/setting/src/main/java/com/puzzle/setting/graph/main/SettingScreen.kt index 278eb1463..7519610a7 100644 --- a/feature/setting/src/main/java/com/puzzle/setting/graph/main/SettingScreen.kt +++ b/feature/setting/src/main/java/com/puzzle/setting/graph/main/SettingScreen.kt @@ -40,6 +40,7 @@ import androidx.compose.ui.res.stringResource import androidx.compose.ui.text.style.TextDecoration import androidx.compose.ui.tooling.preview.Preview import androidx.compose.ui.unit.dp +import androidx.core.app.NotificationManagerCompat import androidx.hilt.navigation.compose.hiltViewModel import androidx.lifecycle.compose.LocalLifecycleOwner import androidx.lifecycle.compose.collectAsStateWithLifecycle @@ -219,13 +220,30 @@ private fun NotificationBody( isPushNotificationEnabled: Boolean, onPushNotificationCheckedChange: () -> Unit, ) { + + val context = LocalContext.current + + val lifecycleOwner = LocalLifecycleOwner.current + val lifecycleState by lifecycleOwner.lifecycle + .currentStateFlow + .collectAsStateWithLifecycle() + val notificationPermission = if (SDK_INT >= TIRAMISU) rememberPermissionState(POST_NOTIFICATIONS) else null - val isPermissionGranted = notificationPermission?.status == PermissionStatus.Granted - || notificationPermission == null - val context = LocalContext.current + val isPermissionGranted = remember( + lifecycleState, + notificationPermission?.status + ) { + NotificationManagerCompat.from(context).areNotificationsEnabled() + } + + LaunchedEffect(isPermissionGranted) { + if (isPermissionGranted && !isPushNotificationEnabled) { + onPushNotificationCheckedChange() + } + } Text( text = stringResource(R.string.setting_notification), @@ -253,7 +271,11 @@ private fun NotificationBody( if (isPermissionGranted) { onPushNotificationCheckedChange() } else { - handlePermission(context, notificationPermission) + if (SDK_INT >= TIRAMISU) { + handlePermission(context, notificationPermission) + } else { + navigateToAppSettings(context) + } } } ) @@ -399,19 +421,24 @@ private fun SystemSettingBody( } @OptIn(ExperimentalPermissionsApi::class) -internal fun handlePermission(context: Context, permission: PermissionState?) { +private fun handlePermission(context: Context, permission: PermissionState?) { permission?.let { if (it.status == PermissionStatus.Granted || !it.status.shouldShowRationale) { - val intent = Intent(Settings.ACTION_APPLICATION_DETAILS_SETTINGS).apply { - data = Uri.fromParts("package", context.packageName, null) - } - context.startActivity(intent) + navigateToAppSettings(context) } else { it.launchPermissionRequest() } } } +private fun navigateToAppSettings(context: Context) { + context.startActivity( + Intent(Settings.ACTION_APPLICATION_DETAILS_SETTINGS).apply { + data = Uri.fromParts("package", context.packageName, null) + } + ) +} + @Composable private fun InquiryBody(onContactUsClick: () -> Unit) { Text(