From 9b665a76b340ccf9ff6c0646f5b1c45a3dc8b92f Mon Sep 17 00:00:00 2001 From: Tangem Date: Thu, 20 Jun 2024 12:30:53 +0500 Subject: [PATCH] Updated on 2026-08-14 --- .../tangem/core/ui/utils/RequestPushPermission.kt | 9 +++------ features/disclaimer/impl/build.gradle.kts | 1 + .../impl/presentation/ui/DisclaimerScreen.kt | 11 ++++------- .../pushnotifications/api/utils/PermissionUtils.kt | 12 +++++++++++- .../impl/presentation/ui/PushNotificationsScreen.kt | 2 ++ .../model/PushNotificationsBottomSheetConfig.kt | 2 +- .../ui/components/PushNotificationsBottomSheet.kt | 8 +++++--- .../wallet/viewmodels/WalletViewModel.kt | 7 ++++--- .../intents/WalletPushPermissionClickIntents.kt | 4 ++-- 9 files changed, 33 insertions(+), 23 deletions(-) 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 index 134039ed07..575485aae9 100644 --- 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 @@ -1,7 +1,5 @@ package com.tangem.core.ui.utils -import android.Manifest -import android.os.Build import androidx.compose.runtime.Composable import androidx.compose.runtime.LaunchedEffect import androidx.compose.runtime.MutableState @@ -14,17 +12,18 @@ import com.google.accompanist.permissions.shouldShowRationale * Returns push permission requester. * Handles granting permission from app settings. */ +@Suppress("LongParameterList") @OptIn(ExperimentalPermissionsApi::class) @Composable fun requestPushPermission( isFirstTimeAsking: Boolean, + pushPermission: String?, isClicked: MutableState, onAllow: () -> Unit, onDeny: () -> Unit, onOpenSettings: () -> Unit, ): () -> Unit { - val permissionState = if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.TIRAMISU) { - val permission = Manifest.permission.POST_NOTIFICATIONS + val permissionState = pushPermission?.let { permission -> val tempPermissionState = rememberPermissionState(permission = permission) rememberPermissionState(permission = permission) { when { @@ -33,8 +32,6 @@ fun requestPushPermission( else -> onDeny() } } - } else { - null } // Check if user granted permission and close bottom sheet diff --git a/features/disclaimer/impl/build.gradle.kts b/features/disclaimer/impl/build.gradle.kts index c82364e03f..b9bb0c5263 100644 --- a/features/disclaimer/impl/build.gradle.kts +++ b/features/disclaimer/impl/build.gradle.kts @@ -40,6 +40,7 @@ dependencies { /** Feature modules */ implementation(projects.features.disclaimer.api) + implementation(projects.features.pushNotifications.api) /** DI */ implementation(deps.hilt.android) diff --git a/features/disclaimer/impl/src/main/java/com/tangem/features/disclaimer/impl/presentation/ui/DisclaimerScreen.kt b/features/disclaimer/impl/src/main/java/com/tangem/features/disclaimer/impl/presentation/ui/DisclaimerScreen.kt index 7b89328a8c..516eab4ef4 100644 --- a/features/disclaimer/impl/src/main/java/com/tangem/features/disclaimer/impl/presentation/ui/DisclaimerScreen.kt +++ b/features/disclaimer/impl/src/main/java/com/tangem/features/disclaimer/impl/presentation/ui/DisclaimerScreen.kt @@ -1,9 +1,7 @@ package com.tangem.features.disclaimer.impl.presentation.ui -import android.Manifest import android.annotation.SuppressLint import android.content.res.Configuration -import android.os.Build import android.view.View import android.view.ViewGroup import android.webkit.WebView @@ -37,6 +35,7 @@ import com.tangem.core.ui.res.TangemThemePreview import com.tangem.features.disclaimer.impl.R import com.tangem.features.disclaimer.impl.presentation.state.DisclaimerState import com.tangem.features.disclaimer.impl.presentation.state.DummyDisclaimer +import com.tangem.features.pushnotifications.api.utils.getPushPermissionOrNull @Composable internal fun DisclaimerScreen(state: DisclaimerState, onBackClick: () -> Unit) { @@ -135,11 +134,9 @@ private fun DisclaimerContent(url: String, isTosAccepted: Boolean) { @OptIn(ExperimentalPermissionsApi::class) @Composable private fun BoxScope.DisclaimerButton(onAccept: (Boolean) -> Unit) { - val shouldAskPushPermission = if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.TIRAMISU) { - rememberPermissionState(permission = Manifest.permission.POST_NOTIFICATIONS).status.isGranted - } else { - true - } + val shouldAskPushPermission = getPushPermissionOrNull()?.let { permission -> + rememberPermissionState(permission = permission).status.isGranted + } ?: true PrimaryButton( text = stringResource(id = R.string.common_accept), onClick = { onAccept(shouldAskPushPermission) }, diff --git a/features/push-notifications/api/src/main/java/com/tangem/features/pushnotifications/api/utils/PermissionUtils.kt b/features/push-notifications/api/src/main/java/com/tangem/features/pushnotifications/api/utils/PermissionUtils.kt index 6092954f2a..c3d27e3ef5 100644 --- a/features/push-notifications/api/src/main/java/com/tangem/features/pushnotifications/api/utils/PermissionUtils.kt +++ b/features/push-notifications/api/src/main/java/com/tangem/features/pushnotifications/api/utils/PermissionUtils.kt @@ -2,9 +2,19 @@ package com.tangem.features.pushnotifications.api.utils import android.Manifest import android.os.Build +import androidx.annotation.ChecksSdkIntAtLeast -val PUSH_PERMISSION = if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.TIRAMISU) { +@ChecksSdkIntAtLeast(api = Build.VERSION_CODES.TIRAMISU) +private val isRequirePushPermission = Build.VERSION.SDK_INT >= Build.VERSION_CODES.TIRAMISU + +val PUSH_PERMISSION = if (isRequirePushPermission) { Manifest.permission.POST_NOTIFICATIONS } else { "android.permission.POST_NOTIFICATIONS" +} + +fun getPushPermissionOrNull() = if (isRequirePushPermission) { + Manifest.permission.POST_NOTIFICATIONS +} else { + null } \ No newline at end of file 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 02c7036aad..9fe0f81030 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 @@ -11,6 +11,7 @@ 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.feature.pushnotifications.impl.R +import com.tangem.features.pushnotifications.api.utils.getPushPermissionOrNull import kotlinx.collections.immutable.persistentListOf @Composable @@ -27,6 +28,7 @@ internal fun PushNotificationsScreen( onAllow = onAllow, onDeny = onLater, onOpenSettings = onOpenSettings, + pushPermission = getPushPermissionOrNull(), ) Showcase( diff --git a/features/wallet/impl/src/main/java/com/tangem/feature/wallet/presentation/wallet/state/model/PushNotificationsBottomSheetConfig.kt b/features/wallet/impl/src/main/java/com/tangem/feature/wallet/presentation/wallet/state/model/PushNotificationsBottomSheetConfig.kt index ed962bf9bd..71638bc6ce 100644 --- a/features/wallet/impl/src/main/java/com/tangem/feature/wallet/presentation/wallet/state/model/PushNotificationsBottomSheetConfig.kt +++ b/features/wallet/impl/src/main/java/com/tangem/feature/wallet/presentation/wallet/state/model/PushNotificationsBottomSheetConfig.kt @@ -4,8 +4,8 @@ import com.tangem.core.ui.components.bottomsheets.TangemBottomSheetConfigContent data class PushNotificationsBottomSheetConfig( val isFirstTimeAsking: Boolean, + val onRequest: () -> Unit, val onAllow: () -> Unit, - val onAllowed: () -> Unit, val onDeny: () -> Unit, val openSettings: () -> Unit, ) : TangemBottomSheetConfigContent \ No newline at end of file diff --git a/features/wallet/impl/src/main/java/com/tangem/feature/wallet/presentation/wallet/ui/components/PushNotificationsBottomSheet.kt b/features/wallet/impl/src/main/java/com/tangem/feature/wallet/presentation/wallet/ui/components/PushNotificationsBottomSheet.kt index 8522dc3b72..15035df238 100644 --- a/features/wallet/impl/src/main/java/com/tangem/feature/wallet/presentation/wallet/ui/components/PushNotificationsBottomSheet.kt +++ b/features/wallet/impl/src/main/java/com/tangem/feature/wallet/presentation/wallet/ui/components/PushNotificationsBottomSheet.kt @@ -24,6 +24,7 @@ import com.tangem.core.ui.res.TangemThemePreview import com.tangem.core.ui.utils.requestPushPermission import com.tangem.feature.wallet.impl.R import com.tangem.feature.wallet.presentation.wallet.state.model.PushNotificationsBottomSheetConfig +import com.tangem.features.pushnotifications.api.utils.getPushPermissionOrNull import kotlinx.collections.immutable.persistentListOf @Composable @@ -37,10 +38,11 @@ internal fun PushNotificationsBottomSheet(config: TangemBottomSheetConfig) { private fun PushNotificationsSheetContent(content: PushNotificationsBottomSheetConfig, onDismiss: () -> Unit) { val isClicked = remember { mutableStateOf(false) } val requestPushPermission = requestPushPermission( + pushPermission = getPushPermissionOrNull(), isFirstTimeAsking = content.isFirstTimeAsking, isClicked = isClicked, onAllow = { - content.onAllowed() + content.onAllow() onDismiss() }, onDeny = { @@ -87,7 +89,7 @@ private fun PushNotificationsSheetContent(content: PushNotificationsBottomSheetC text = stringResource(R.string.common_allow), onClick = { isClicked.value = true - content.onAllow() + content.onRequest() requestPushPermission() }, modifier = Modifier.weight(1f), @@ -105,8 +107,8 @@ private fun PushNotificationsSheetContent_Preview() { PushNotificationsSheetContent( PushNotificationsBottomSheetConfig( isFirstTimeAsking = false, + onRequest = {}, onAllow = {}, - onAllowed = {}, onDeny = {}, openSettings = {}, ), diff --git a/features/wallet/impl/src/main/java/com/tangem/feature/wallet/presentation/wallet/viewmodels/WalletViewModel.kt b/features/wallet/impl/src/main/java/com/tangem/feature/wallet/presentation/wallet/viewmodels/WalletViewModel.kt index c4242a3c48..131bc32cd4 100644 --- a/features/wallet/impl/src/main/java/com/tangem/feature/wallet/presentation/wallet/viewmodels/WalletViewModel.kt +++ b/features/wallet/impl/src/main/java/com/tangem/feature/wallet/presentation/wallet/viewmodels/WalletViewModel.kt @@ -155,7 +155,8 @@ internal class WalletViewModel @Inject constructor( private fun subscribeOnPushNotificationsPermission() { viewModelScope.launch { if (!shouldAskPermissionUseCase(PUSH_PERMISSION)) return@launch - withContext(dispatchers.io) { delay(timeMillis = 1_800) } + + delay(timeMillis = 1_800) val isFirstTimeAsking = isFirstTimeAskingPermissionUseCase(PUSH_PERMISSION).getOrElse { true } val wasInitiallyAsk = shouldInitiallyAskPermissionUseCase(PUSH_PERMISSION).getOrElse { true } @@ -167,8 +168,8 @@ internal class WalletViewModel @Inject constructor( stateHolder.showBottomSheet( PushNotificationsBottomSheetConfig( isFirstTimeAsking = isFirstTimeAsking, - onAllow = clickIntents::onAllowPushPermission, - onAllowed = clickIntents::onNeverAskPushPermission, + onRequest = clickIntents::onRequestPushPermission, + onAllow = clickIntents::onNeverAskPushPermission, onDeny = onDenyClick, openSettings = settingsManager::openSettings, ), diff --git a/features/wallet/impl/src/main/java/com/tangem/feature/wallet/presentation/wallet/viewmodels/intents/WalletPushPermissionClickIntents.kt b/features/wallet/impl/src/main/java/com/tangem/feature/wallet/presentation/wallet/viewmodels/intents/WalletPushPermissionClickIntents.kt index 3f5138ca6d..d2f05b0f2a 100644 --- a/features/wallet/impl/src/main/java/com/tangem/feature/wallet/presentation/wallet/viewmodels/intents/WalletPushPermissionClickIntents.kt +++ b/features/wallet/impl/src/main/java/com/tangem/feature/wallet/presentation/wallet/viewmodels/intents/WalletPushPermissionClickIntents.kt @@ -10,7 +10,7 @@ import javax.inject.Inject internal interface WalletPushPermissionClickIntents { - fun onAllowPushPermission() + fun onRequestPushPermission() fun onDelayAskPushPermission() @@ -24,7 +24,7 @@ internal class WalletPushPermissionClickIntentsImplementor @Inject constructor( private val delayPermissionRequestUseCase: DelayPermissionRequestUseCase, ) : BaseWalletClickIntents(), WalletPushPermissionClickIntents { - override fun onAllowPushPermission() { + override fun onRequestPushPermission() { viewModelScope.launch { setFirstTimeAskingPermissionUseCase(PUSH_PERMISSION) }