From b0b416c9c3b2bbea7646eb6c5cc4eaf3eb0188a2 Mon Sep 17 00:00:00 2001 From: Tangem Date: Wed, 30 Jul 2025 11:42:17 +0300 Subject: [PATCH] Updated on 2026-08-14 --- .../tangem/core/ui/utils/RequestPermission.kt | 43 +++++++++++++++++++ .../core/ui/utils/RequestPushPermission.kt | 33 -------------- .../ui/PushNotificationsBottomSheet.kt | 8 ++-- .../ui/PushNotificationsScreen.kt | 10 ++--- .../walletsettings/ui/WalletSettingsScreen.kt | 13 +++--- 5 files changed, 60 insertions(+), 47 deletions(-) create mode 100644 core/ui/src/main/java/com/tangem/core/ui/utils/RequestPermission.kt delete mode 100644 core/ui/src/main/java/com/tangem/core/ui/utils/RequestPushPermission.kt diff --git a/core/ui/src/main/java/com/tangem/core/ui/utils/RequestPermission.kt b/core/ui/src/main/java/com/tangem/core/ui/utils/RequestPermission.kt new file mode 100644 index 0000000000..9e0910e239 --- /dev/null +++ b/core/ui/src/main/java/com/tangem/core/ui/utils/RequestPermission.kt @@ -0,0 +1,43 @@ +package com.tangem.core.ui.utils + +import android.os.Build +import androidx.annotation.ChecksSdkIntAtLeast +import androidx.compose.runtime.Composable +import com.google.accompanist.permissions.ExperimentalPermissionsApi +import com.google.accompanist.permissions.isGranted +import com.google.accompanist.permissions.rememberPermissionState + +/** + * Returns push permission requester. + * Handles granting permission from app settings. + */ +@Suppress("LongParameterList") +@OptIn(ExperimentalPermissionsApi::class) +@Composable +fun requestPermission(permission: String, onAllow: () -> Unit, onDeny: () -> Unit): () -> Unit { + val permissionState = rememberPermissionState( + permission = permission, + onPermissionResult = { isGranted -> + if (isGranted) { + onAllow() + } else { + onDeny() + } + }, + ) + return when { + permissionState.status.isGranted == false -> { + if (isRequirePushPermission) { + permissionState::launchPermissionRequest + } else { + onDeny // on versions below Tiramisu call onDeny directly and then open settings + } + } + else -> { + onAllow + } + } +} + +@ChecksSdkIntAtLeast(api = Build.VERSION_CODES.TIRAMISU) +private val isRequirePushPermission = Build.VERSION.SDK_INT >= Build.VERSION_CODES.TIRAMISU \ No newline at end of file diff --git a/core/ui/src/main/java/com/tangem/core/ui/utils/RequestPushPermission.kt b/core/ui/src/main/java/com/tangem/core/ui/utils/RequestPushPermission.kt deleted file mode 100644 index 4f6cc6d0df..0000000000 --- a/core/ui/src/main/java/com/tangem/core/ui/utils/RequestPushPermission.kt +++ /dev/null @@ -1,33 +0,0 @@ -package com.tangem.core.ui.utils - -import androidx.compose.runtime.Composable -import com.google.accompanist.permissions.ExperimentalPermissionsApi -import com.google.accompanist.permissions.rememberPermissionState - -/** - * Returns push permission requester. - * Handles granting permission from app settings. - */ -@Suppress("LongParameterList") -@OptIn(ExperimentalPermissionsApi::class) -@Composable -fun requestPushPermission(pushPermission: String?, onAllow: () -> Unit, onDeny: () -> Unit): () -> Unit { - val permissionState = pushPermission?.let { permission -> - rememberPermissionState( - permission = permission, - onPermissionResult = { isGranted -> - if (isGranted) { - onAllow() - } else { - onDeny() - } - }, - ) - } - - return if (permissionState == null) { - {} - } else { - permissionState::launchPermissionRequest - } -} \ No newline at end of file diff --git a/features/push-notifications/impl/src/main/java/com/tangem/features/pushnotifications/impl/presentation/ui/PushNotificationsBottomSheet.kt b/features/push-notifications/impl/src/main/java/com/tangem/features/pushnotifications/impl/presentation/ui/PushNotificationsBottomSheet.kt index bd30c68bc5..fa78628411 100644 --- a/features/push-notifications/impl/src/main/java/com/tangem/features/pushnotifications/impl/presentation/ui/PushNotificationsBottomSheet.kt +++ b/features/push-notifications/impl/src/main/java/com/tangem/features/pushnotifications/impl/presentation/ui/PushNotificationsBottomSheet.kt @@ -19,8 +19,8 @@ import com.tangem.core.ui.components.showcase.model.ShowcaseItemModel import com.tangem.core.ui.extensions.resourceReference import com.tangem.core.ui.res.TangemTheme import com.tangem.core.ui.res.TangemThemePreview -import com.tangem.core.ui.utils.requestPushPermission -import com.tangem.features.pushnotifications.api.utils.getPushPermissionOrNull +import com.tangem.core.ui.utils.requestPermission +import com.tangem.features.pushnotifications.api.utils.PUSH_PERMISSION import kotlinx.collections.immutable.persistentListOf @Composable @@ -46,10 +46,10 @@ internal fun PushNotificationsContent( onDenyPermission: () -> Unit, showNotificationsInfo: Boolean, ) { - val requestPushPermission = requestPushPermission( + val requestPushPermission = requestPermission( onAllow = onAllowPermission, onDeny = onDenyPermission, - pushPermission = getPushPermissionOrNull(), + permission = PUSH_PERMISSION, ) Column(modifier = Modifier.background(TangemTheme.colors.background.primary)) { diff --git a/features/push-notifications/impl/src/main/java/com/tangem/features/pushnotifications/impl/presentation/ui/PushNotificationsScreen.kt b/features/push-notifications/impl/src/main/java/com/tangem/features/pushnotifications/impl/presentation/ui/PushNotificationsScreen.kt index 207ff60b54..4750463f50 100644 --- a/features/push-notifications/impl/src/main/java/com/tangem/features/pushnotifications/impl/presentation/ui/PushNotificationsScreen.kt +++ b/features/push-notifications/impl/src/main/java/com/tangem/features/pushnotifications/impl/presentation/ui/PushNotificationsScreen.kt @@ -1,15 +1,15 @@ package com.tangem.features.pushnotifications.impl.presentation.ui import androidx.compose.foundation.layout.systemBarsPadding -import androidx.compose.runtime.* +import androidx.compose.runtime.Composable import androidx.compose.ui.Modifier import com.tangem.core.ui.components.showcase.Showcase import com.tangem.core.ui.components.showcase.model.ShowcaseButtonModel import com.tangem.core.ui.components.showcase.model.ShowcaseItemModel import com.tangem.core.ui.extensions.resourceReference -import com.tangem.core.ui.utils.requestPushPermission +import com.tangem.core.ui.utils.requestPermission import com.tangem.feature.pushnotifications.impl.R -import com.tangem.features.pushnotifications.api.utils.getPushPermissionOrNull +import com.tangem.features.pushnotifications.api.utils.PUSH_PERMISSION import kotlinx.collections.immutable.persistentListOf @Composable @@ -20,10 +20,10 @@ internal fun PushNotificationsScreen( onDenyPermission: () -> Unit, showNotificationsInfo: Boolean, ) { - val requestPushPermission = requestPushPermission( + val requestPushPermission = requestPermission( onAllow = onAllowPermission, onDeny = onDenyPermission, - pushPermission = getPushPermissionOrNull(), + permission = PUSH_PERMISSION, ) Showcase( diff --git a/features/wallet-settings/impl/src/main/kotlin/com/tangem/feature/walletsettings/ui/WalletSettingsScreen.kt b/features/wallet-settings/impl/src/main/kotlin/com/tangem/feature/walletsettings/ui/WalletSettingsScreen.kt index 64dc1120ee..cf08dc9da6 100644 --- a/features/wallet-settings/impl/src/main/kotlin/com/tangem/feature/walletsettings/ui/WalletSettingsScreen.kt +++ b/features/wallet-settings/impl/src/main/kotlin/com/tangem/feature/walletsettings/ui/WalletSettingsScreen.kt @@ -8,6 +8,7 @@ import androidx.compose.foundation.lazy.items import androidx.compose.material3.Scaffold import androidx.compose.material3.Text import androidx.compose.runtime.Composable +import androidx.compose.runtime.LaunchedEffect import androidx.compose.ui.Alignment import androidx.compose.ui.Modifier import androidx.compose.ui.platform.testTag @@ -28,12 +29,12 @@ import com.tangem.core.ui.extensions.stringResourceSafe import com.tangem.core.ui.res.TangemTheme import com.tangem.core.ui.res.TangemThemePreview import com.tangem.core.ui.test.TestTags -import com.tangem.core.ui.utils.requestPushPermission +import com.tangem.core.ui.utils.requestPermission import com.tangem.feature.walletsettings.component.preview.PreviewWalletSettingsComponent import com.tangem.feature.walletsettings.entity.WalletSettingsItemUM import com.tangem.feature.walletsettings.entity.WalletSettingsUM import com.tangem.feature.walletsettings.impl.R -import com.tangem.features.pushnotifications.api.utils.getPushPermissionOrNull +import com.tangem.features.pushnotifications.api.utils.PUSH_PERMISSION @Composable internal fun WalletSettingsScreen( @@ -119,14 +120,16 @@ private fun Content(state: WalletSettingsUM, modifier: Modifier = Modifier) { } } - val requestPushPermission = requestPushPermission( + val requestPushPermission = requestPermission( onAllow = { state.onPushNotificationPermissionGranted(true) }, onDeny = { state.onPushNotificationPermissionGranted(false) }, - pushPermission = getPushPermissionOrNull(), + permission = PUSH_PERMISSION, ) if (state.requestPushNotificationsPermission) { - requestPushPermission() + LaunchedEffect(Unit) { + requestPushPermission() + } } }