Updated on 2026-08-14

This commit is contained in:
Tangem 2025-07-30 11:42:17 +03:00
parent 67da274df2
commit b0b416c9c3
5 changed files with 60 additions and 47 deletions

View file

@ -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

View file

@ -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
}
}

View file

@ -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)) {

View file

@ -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(

View file

@ -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()
}
}
}