Updated on 2026-08-14
This commit is contained in:
parent
07d5ede58c
commit
e1b50efbe0
16 changed files with 21 additions and 222 deletions
|
|
@ -184,30 +184,6 @@ internal object SettingsDomainModule {
|
||||||
return NeverToInitiallyAskPermissionUseCase(repository = permissionRepository)
|
return NeverToInitiallyAskPermissionUseCase(repository = permissionRepository)
|
||||||
}
|
}
|
||||||
|
|
||||||
@Provides
|
|
||||||
@Singleton
|
|
||||||
fun provideIsFirstTimeAskingPermissionUseCase(
|
|
||||||
permissionRepository: PermissionRepository,
|
|
||||||
): IsFirstTimeAskingPermissionUseCase {
|
|
||||||
return IsFirstTimeAskingPermissionUseCase(repository = permissionRepository)
|
|
||||||
}
|
|
||||||
|
|
||||||
@Provides
|
|
||||||
@Singleton
|
|
||||||
fun provideSetFirstTimeAskingPushPermissionUseCase(
|
|
||||||
permissionRepository: PermissionRepository,
|
|
||||||
): SetFirstTimeAskingPermissionUseCase {
|
|
||||||
return SetFirstTimeAskingPermissionUseCase(repository = permissionRepository)
|
|
||||||
}
|
|
||||||
|
|
||||||
@Provides
|
|
||||||
@Singleton
|
|
||||||
fun provideDelayPermissionRequestUseCase(
|
|
||||||
permissionRepository: PermissionRepository,
|
|
||||||
): DelayPermissionRequestUseCase {
|
|
||||||
return DelayPermissionRequestUseCase(repository = permissionRepository)
|
|
||||||
}
|
|
||||||
|
|
||||||
@Provides
|
@Provides
|
||||||
@Singleton
|
@Singleton
|
||||||
fun provideShouldAskPermissionUseCase(permissionRepository: PermissionRepository): ShouldAskPermissionUseCase {
|
fun provideShouldAskPermissionUseCase(permissionRepository: PermissionRepository): ShouldAskPermissionUseCase {
|
||||||
|
|
|
||||||
|
|
@ -6,7 +6,6 @@ import androidx.compose.runtime.MutableState
|
||||||
import com.google.accompanist.permissions.ExperimentalPermissionsApi
|
import com.google.accompanist.permissions.ExperimentalPermissionsApi
|
||||||
import com.google.accompanist.permissions.isGranted
|
import com.google.accompanist.permissions.isGranted
|
||||||
import com.google.accompanist.permissions.rememberPermissionState
|
import com.google.accompanist.permissions.rememberPermissionState
|
||||||
import com.google.accompanist.permissions.shouldShowRationale
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Returns push permission requester.
|
* Returns push permission requester.
|
||||||
|
|
@ -16,21 +15,13 @@ import com.google.accompanist.permissions.shouldShowRationale
|
||||||
@OptIn(ExperimentalPermissionsApi::class)
|
@OptIn(ExperimentalPermissionsApi::class)
|
||||||
@Composable
|
@Composable
|
||||||
fun requestPushPermission(
|
fun requestPushPermission(
|
||||||
isFirstTimeAsking: Boolean,
|
|
||||||
pushPermission: String?,
|
pushPermission: String?,
|
||||||
isClicked: MutableState<Boolean>,
|
isClicked: MutableState<Boolean>,
|
||||||
onAllow: () -> Unit,
|
onAllow: () -> Unit,
|
||||||
onDeny: () -> Unit,
|
onDeny: () -> Unit,
|
||||||
onOpenSettings: () -> Unit,
|
|
||||||
): () -> Unit {
|
): () -> Unit {
|
||||||
val permissionState = pushPermission?.let { permission ->
|
val permissionState = pushPermission?.let { permission ->
|
||||||
val tempPermissionState = rememberPermissionState(permission = permission)
|
rememberPermissionState(permission = permission)
|
||||||
rememberPermissionState(permission = permission) {
|
|
||||||
val isGranted = tempPermissionState.status.isGranted
|
|
||||||
val shouldShowRationale = tempPermissionState.status.shouldShowRationale
|
|
||||||
|
|
||||||
if (isGranted && !shouldShowRationale && !isFirstTimeAsking) onOpenSettings()
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
// Check if user granted permission and close bottom sheet
|
// Check if user granted permission and close bottom sheet
|
||||||
|
|
@ -44,7 +35,7 @@ fun requestPushPermission(
|
||||||
}
|
}
|
||||||
|
|
||||||
return if (permissionState == null) {
|
return if (permissionState == null) {
|
||||||
onOpenSettings
|
{}
|
||||||
} else {
|
} else {
|
||||||
permissionState::launchPermissionRequest
|
permissionState::launchPermissionRequest
|
||||||
}
|
}
|
||||||
|
|
|
||||||
|
|
@ -1,11 +1,6 @@
|
||||||
package com.tangem.data.settings
|
package com.tangem.data.settings
|
||||||
|
|
||||||
import android.os.SystemClock
|
|
||||||
import com.tangem.datasource.local.preferences.AppPreferencesStore
|
import com.tangem.datasource.local.preferences.AppPreferencesStore
|
||||||
import com.tangem.datasource.local.preferences.PreferencesKeys
|
|
||||||
import com.tangem.datasource.local.preferences.PreferencesKeys.getIsFirstTimeAskingPermission
|
|
||||||
import com.tangem.datasource.local.preferences.PreferencesKeys.getPermissionDaysCount
|
|
||||||
import com.tangem.datasource.local.preferences.PreferencesKeys.getPermissionLaunchCount
|
|
||||||
import com.tangem.datasource.local.preferences.PreferencesKeys.getShouldShowInitialPermissionScreen
|
import com.tangem.datasource.local.preferences.PreferencesKeys.getShouldShowInitialPermissionScreen
|
||||||
import com.tangem.datasource.local.preferences.PreferencesKeys.getShouldShowPermission
|
import com.tangem.datasource.local.preferences.PreferencesKeys.getShouldShowPermission
|
||||||
import com.tangem.datasource.local.preferences.utils.getSyncOrDefault
|
import com.tangem.datasource.local.preferences.utils.getSyncOrDefault
|
||||||
|
|
@ -30,47 +25,11 @@ internal class DefaultPermissionRepository(
|
||||||
)
|
)
|
||||||
}
|
}
|
||||||
|
|
||||||
override suspend fun isFirstTimeAskingPermission(permission: String): Boolean =
|
|
||||||
appPreferencesStore.getSyncOrDefault(
|
|
||||||
key = getIsFirstTimeAskingPermission(permission),
|
|
||||||
default = true,
|
|
||||||
)
|
|
||||||
|
|
||||||
override suspend fun setFirstTimeAskingPermission(permission: String, value: Boolean) {
|
|
||||||
appPreferencesStore.store(
|
|
||||||
key = getIsFirstTimeAskingPermission(permission),
|
|
||||||
value = value,
|
|
||||||
)
|
|
||||||
}
|
|
||||||
|
|
||||||
override suspend fun shouldAskPermission(permission: String): Boolean {
|
override suspend fun shouldAskPermission(permission: String): Boolean {
|
||||||
val shouldAskPermission = appPreferencesStore.getSyncOrDefault(getShouldShowPermission(permission), true)
|
return appPreferencesStore.getSyncOrDefault(getShouldShowPermission(permission), true)
|
||||||
val delayedLaunches = appPreferencesStore.getSyncOrDefault(getPermissionLaunchCount(permission), 0)
|
|
||||||
val delayedDays = appPreferencesStore.getSyncOrDefault(getPermissionDaysCount(permission), 0)
|
|
||||||
val currentLaunchCounter = appPreferencesStore.getSyncOrDefault(PreferencesKeys.APP_LAUNCH_COUNT_KEY, 0)
|
|
||||||
|
|
||||||
val nowMillis = SystemClock.elapsedRealtime()
|
|
||||||
val isDaysDelayed = delayedDays < nowMillis
|
|
||||||
val isLaunchesDelayed = delayedLaunches < currentLaunchCounter
|
|
||||||
return shouldAskPermission && isDaysDelayed && isLaunchesDelayed
|
|
||||||
}
|
}
|
||||||
|
|
||||||
override suspend fun neverAskPermission(permission: String) {
|
override suspend fun neverAskPermission(permission: String) {
|
||||||
appPreferencesStore.store(key = getShouldShowPermission(permission), value = false)
|
appPreferencesStore.store(key = getShouldShowPermission(permission), value = false)
|
||||||
}
|
}
|
||||||
|
|
||||||
override suspend fun delayPermissionAsking(permission: String) {
|
|
||||||
appPreferencesStore.editData {
|
|
||||||
val appLaunchCounter = it.getOrDefault(PreferencesKeys.APP_LAUNCH_COUNT_KEY, 0)
|
|
||||||
val nowMillis = SystemClock.elapsedRealtime()
|
|
||||||
|
|
||||||
it[getPermissionLaunchCount(permission)] = appLaunchCounter + DELAY_LAUNCH_COUNT
|
|
||||||
it[getPermissionDaysCount(permission)] = nowMillis + DELAY_DAYS_COUNT
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
private companion object {
|
|
||||||
const val DELAY_LAUNCH_COUNT = 5
|
|
||||||
const val DELAY_DAYS_COUNT = 3L * 24 * 3600 * 1000 // 3 days in millis
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
@ -1,13 +0,0 @@
|
||||||
package com.tangem.domain.settings
|
|
||||||
|
|
||||||
import arrow.core.Either
|
|
||||||
import com.tangem.domain.settings.repositories.PermissionRepository
|
|
||||||
|
|
||||||
class DelayPermissionRequestUseCase(
|
|
||||||
private val repository: PermissionRepository,
|
|
||||||
) {
|
|
||||||
|
|
||||||
suspend operator fun invoke(permission: String): Either<Throwable, Unit> = Either.catch {
|
|
||||||
repository.delayPermissionAsking(permission)
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
@ -1,11 +0,0 @@
|
||||||
package com.tangem.domain.settings
|
|
||||||
|
|
||||||
import arrow.core.Either
|
|
||||||
import com.tangem.domain.settings.repositories.PermissionRepository
|
|
||||||
|
|
||||||
class IsFirstTimeAskingPermissionUseCase(private val repository: PermissionRepository) {
|
|
||||||
|
|
||||||
suspend operator fun invoke(permission: String): Either<Throwable, Boolean> = Either.catch {
|
|
||||||
repository.isFirstTimeAskingPermission(permission)
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
@ -1,11 +0,0 @@
|
||||||
package com.tangem.domain.settings
|
|
||||||
|
|
||||||
import arrow.core.Either
|
|
||||||
import com.tangem.domain.settings.repositories.PermissionRepository
|
|
||||||
|
|
||||||
class SetFirstTimeAskingPermissionUseCase(private val repository: PermissionRepository) {
|
|
||||||
|
|
||||||
suspend operator fun invoke(permission: String): Either<Throwable, Unit> = Either.catch {
|
|
||||||
repository.setFirstTimeAskingPermission(permission, false)
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
@ -13,18 +13,6 @@ interface PermissionRepository {
|
||||||
*/
|
*/
|
||||||
suspend fun neverInitiallyShowPermissionScreen(permission: String)
|
suspend fun neverInitiallyShowPermissionScreen(permission: String)
|
||||||
|
|
||||||
/**
|
|
||||||
* Indicates which time [permission] was asked via platform dialog.
|
|
||||||
* NOTE: Use this method to indicate either reroute to settings or display platform dialog.
|
|
||||||
*/
|
|
||||||
suspend fun isFirstTimeAskingPermission(permission: String): Boolean
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Sets value indicating that [permission] was asked via platform dialog.
|
|
||||||
* NOTE: Use this method to indicate either reroute to settings or display platform dialog.
|
|
||||||
*/
|
|
||||||
suspend fun setFirstTimeAskingPermission(permission: String, value: Boolean)
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Is clear to ask [permission].
|
* Is clear to ask [permission].
|
||||||
* User could already granted or permanently denied permission
|
* User could already granted or permanently denied permission
|
||||||
|
|
@ -36,9 +24,4 @@ interface PermissionRepository {
|
||||||
* Permanently deny [permission] and never request again
|
* Permanently deny [permission] and never request again
|
||||||
*/
|
*/
|
||||||
suspend fun neverAskPermission(permission: String)
|
suspend fun neverAskPermission(permission: String)
|
||||||
|
|
||||||
/**
|
|
||||||
* Delay next [permission] request for some time or active sessions
|
|
||||||
*/
|
|
||||||
suspend fun delayPermissionAsking(permission: String)
|
|
||||||
}
|
}
|
||||||
|
|
@ -17,19 +17,15 @@ sealed class PushNotificationAnalyticEvents(
|
||||||
),
|
),
|
||||||
)
|
)
|
||||||
|
|
||||||
data class ButtonLater(
|
data class ButtonCancel(
|
||||||
val source: AnalyticsParam.ScreensSources,
|
val source: AnalyticsParam.ScreensSources,
|
||||||
) : PushNotificationAnalyticEvents(
|
) : PushNotificationAnalyticEvents(
|
||||||
event = "Button - Later",
|
event = "Button - Cancel",
|
||||||
params = mapOf(
|
params = mapOf(
|
||||||
AnalyticsParam.SOURCE to source.value,
|
AnalyticsParam.SOURCE to source.value,
|
||||||
),
|
),
|
||||||
)
|
)
|
||||||
|
|
||||||
data object ButtonCancel : PushNotificationAnalyticEvents(
|
|
||||||
event = "Button - Cancel",
|
|
||||||
)
|
|
||||||
|
|
||||||
data class PermissionStatus(
|
data class PermissionStatus(
|
||||||
val isAllowed: Boolean,
|
val isAllowed: Boolean,
|
||||||
) : PushNotificationAnalyticEvents(
|
) : PushNotificationAnalyticEvents(
|
||||||
|
|
|
||||||
|
|
@ -26,10 +26,9 @@ internal class PushNotificationsFragment : ComposeFragment() {
|
||||||
NavigationBar3ButtonsScrim()
|
NavigationBar3ButtonsScrim()
|
||||||
PushNotificationsScreen(
|
PushNotificationsScreen(
|
||||||
onRequest = viewModel::onRequest,
|
onRequest = viewModel::onRequest,
|
||||||
onRequestLater = viewModel::onRequestLater,
|
onNeverRequest = viewModel::onNeverRequest,
|
||||||
onAllowPermission = viewModel::onAllowPermission,
|
onAllowPermission = viewModel::onAllowPermission,
|
||||||
onDenyPermission = viewModel::onDenyPermission,
|
onDenyPermission = viewModel::onDenyPermission,
|
||||||
onOpenSettings = viewModel::openSettings,
|
|
||||||
)
|
)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -17,18 +17,15 @@ import kotlinx.collections.immutable.persistentListOf
|
||||||
@Composable
|
@Composable
|
||||||
internal fun PushNotificationsScreen(
|
internal fun PushNotificationsScreen(
|
||||||
onRequest: () -> Unit,
|
onRequest: () -> Unit,
|
||||||
onRequestLater: () -> Unit,
|
onNeverRequest: () -> Unit,
|
||||||
onAllowPermission: () -> Unit,
|
onAllowPermission: () -> Unit,
|
||||||
onDenyPermission: () -> Unit,
|
onDenyPermission: () -> Unit,
|
||||||
onOpenSettings: () -> Unit,
|
|
||||||
) {
|
) {
|
||||||
val isClicked = remember { mutableStateOf(false) }
|
val isClicked = remember { mutableStateOf(false) }
|
||||||
val requestPushPermission = requestPushPermission(
|
val requestPushPermission = requestPushPermission(
|
||||||
isFirstTimeAsking = true,
|
|
||||||
isClicked = isClicked,
|
isClicked = isClicked,
|
||||||
onAllow = onAllowPermission,
|
onAllow = onAllowPermission,
|
||||||
onDeny = onDenyPermission,
|
onDeny = onDenyPermission,
|
||||||
onOpenSettings = onOpenSettings,
|
|
||||||
pushPermission = getPushPermissionOrNull(),
|
pushPermission = getPushPermissionOrNull(),
|
||||||
)
|
)
|
||||||
|
|
||||||
|
|
@ -54,8 +51,8 @@ internal fun PushNotificationsScreen(
|
||||||
},
|
},
|
||||||
),
|
),
|
||||||
secondaryButton = ShowcaseButtonModel(
|
secondaryButton = ShowcaseButtonModel(
|
||||||
buttonText = resourceReference(R.string.common_later),
|
buttonText = resourceReference(R.string.common_cancel),
|
||||||
onClick = onRequestLater,
|
onClick = onNeverRequest,
|
||||||
),
|
),
|
||||||
modifier = Modifier.systemBarsPadding(),
|
modifier = Modifier.systemBarsPadding(),
|
||||||
)
|
)
|
||||||
|
|
|
||||||
|
|
@ -4,11 +4,7 @@ import androidx.lifecycle.ViewModel
|
||||||
import androidx.lifecycle.viewModelScope
|
import androidx.lifecycle.viewModelScope
|
||||||
import com.tangem.core.analytics.api.AnalyticsEventHandler
|
import com.tangem.core.analytics.api.AnalyticsEventHandler
|
||||||
import com.tangem.core.analytics.models.AnalyticsParam
|
import com.tangem.core.analytics.models.AnalyticsParam
|
||||||
import com.tangem.core.navigation.settings.SettingsManager
|
|
||||||
import com.tangem.domain.settings.DelayPermissionRequestUseCase
|
|
||||||
import com.tangem.domain.settings.NeverRequestPermissionUseCase
|
import com.tangem.domain.settings.NeverRequestPermissionUseCase
|
||||||
import com.tangem.domain.settings.NeverToInitiallyAskPermissionUseCase
|
|
||||||
import com.tangem.domain.settings.SetFirstTimeAskingPermissionUseCase
|
|
||||||
import com.tangem.features.pushnotifications.api.analytics.PushNotificationAnalyticEvents
|
import com.tangem.features.pushnotifications.api.analytics.PushNotificationAnalyticEvents
|
||||||
import com.tangem.features.pushnotifications.api.utils.PUSH_PERMISSION
|
import com.tangem.features.pushnotifications.api.utils.PUSH_PERMISSION
|
||||||
import com.tangem.features.pushnotifications.impl.navigation.DefaultPushNotificationsRouter
|
import com.tangem.features.pushnotifications.impl.navigation.DefaultPushNotificationsRouter
|
||||||
|
|
@ -19,12 +15,8 @@ import javax.inject.Inject
|
||||||
@Suppress("LongParameterList")
|
@Suppress("LongParameterList")
|
||||||
@HiltViewModel
|
@HiltViewModel
|
||||||
internal class PushNotificationViewModel @Inject constructor(
|
internal class PushNotificationViewModel @Inject constructor(
|
||||||
private val setFirstTimeAskingPermissionUseCase: SetFirstTimeAskingPermissionUseCase,
|
|
||||||
private val delayPermissionRequestUseCase: DelayPermissionRequestUseCase,
|
|
||||||
private val neverRequestPermissionUseCase: NeverRequestPermissionUseCase,
|
private val neverRequestPermissionUseCase: NeverRequestPermissionUseCase,
|
||||||
private val neverToInitiallyAskPermissionUseCase: NeverToInitiallyAskPermissionUseCase,
|
|
||||||
private val router: DefaultPushNotificationsRouter,
|
private val router: DefaultPushNotificationsRouter,
|
||||||
private val settingsManager: SettingsManager,
|
|
||||||
private val analyticHandler: AnalyticsEventHandler,
|
private val analyticHandler: AnalyticsEventHandler,
|
||||||
) : ViewModel(), PushNotificationsClickIntents {
|
) : ViewModel(), PushNotificationsClickIntents {
|
||||||
|
|
||||||
|
|
@ -32,19 +24,14 @@ internal class PushNotificationViewModel @Inject constructor(
|
||||||
analyticHandler.send(
|
analyticHandler.send(
|
||||||
PushNotificationAnalyticEvents.ButtonAllow(AnalyticsParam.ScreensSources.Stories),
|
PushNotificationAnalyticEvents.ButtonAllow(AnalyticsParam.ScreensSources.Stories),
|
||||||
)
|
)
|
||||||
viewModelScope.launch {
|
|
||||||
setFirstTimeAskingPermissionUseCase(PUSH_PERMISSION)
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
override fun onRequestLater() {
|
override fun onNeverRequest() {
|
||||||
analyticHandler.send(
|
analyticHandler.send(
|
||||||
PushNotificationAnalyticEvents.ButtonLater(AnalyticsParam.ScreensSources.Stories),
|
PushNotificationAnalyticEvents.ButtonCancel(AnalyticsParam.ScreensSources.Stories),
|
||||||
)
|
)
|
||||||
viewModelScope.launch {
|
viewModelScope.launch {
|
||||||
delayPermissionRequestUseCase(PUSH_PERMISSION)
|
neverRequestPermissionUseCase(PUSH_PERMISSION)
|
||||||
setFirstTimeAskingPermissionUseCase(PUSH_PERMISSION)
|
|
||||||
neverToInitiallyAskPermissionUseCase(PUSH_PERMISSION)
|
|
||||||
router.openHome()
|
router.openHome()
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
@ -55,7 +42,6 @@ internal class PushNotificationViewModel @Inject constructor(
|
||||||
)
|
)
|
||||||
viewModelScope.launch {
|
viewModelScope.launch {
|
||||||
neverRequestPermissionUseCase(PUSH_PERMISSION)
|
neverRequestPermissionUseCase(PUSH_PERMISSION)
|
||||||
neverToInitiallyAskPermissionUseCase(PUSH_PERMISSION)
|
|
||||||
router.openHome()
|
router.openHome()
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
@ -65,11 +51,8 @@ internal class PushNotificationViewModel @Inject constructor(
|
||||||
PushNotificationAnalyticEvents.PermissionStatus(isAllowed = false),
|
PushNotificationAnalyticEvents.PermissionStatus(isAllowed = false),
|
||||||
)
|
)
|
||||||
viewModelScope.launch {
|
viewModelScope.launch {
|
||||||
delayPermissionRequestUseCase(PUSH_PERMISSION)
|
neverRequestPermissionUseCase(PUSH_PERMISSION)
|
||||||
neverToInitiallyAskPermissionUseCase(PUSH_PERMISSION)
|
|
||||||
router.openHome()
|
router.openHome()
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
override fun openSettings() = settingsManager.openSettings()
|
|
||||||
}
|
}
|
||||||
|
|
@ -3,11 +3,9 @@ package com.tangem.features.pushnotifications.impl.presentation.viewmodel
|
||||||
internal interface PushNotificationsClickIntents {
|
internal interface PushNotificationsClickIntents {
|
||||||
fun onRequest()
|
fun onRequest()
|
||||||
|
|
||||||
fun onRequestLater()
|
fun onNeverRequest()
|
||||||
|
|
||||||
fun onAllowPermission()
|
fun onAllowPermission()
|
||||||
|
|
||||||
fun onDenyPermission()
|
fun onDenyPermission()
|
||||||
|
|
||||||
fun openSettings()
|
|
||||||
}
|
}
|
||||||
|
|
@ -3,11 +3,8 @@ package com.tangem.feature.wallet.presentation.wallet.state.model
|
||||||
import com.tangem.core.ui.components.bottomsheets.TangemBottomSheetConfigContent
|
import com.tangem.core.ui.components.bottomsheets.TangemBottomSheetConfigContent
|
||||||
|
|
||||||
data class PushNotificationsBottomSheetConfig(
|
data class PushNotificationsBottomSheetConfig(
|
||||||
val isFirstTimeRequested: Boolean,
|
|
||||||
val wasInitiallyAsk: Boolean,
|
|
||||||
val onRequest: () -> Unit,
|
val onRequest: () -> Unit,
|
||||||
val onRequestLater: () -> Unit,
|
val onNeverRequest: () -> Unit,
|
||||||
val onAllow: () -> Unit,
|
val onAllow: () -> Unit,
|
||||||
val onDeny: () -> Unit,
|
val onDeny: () -> Unit,
|
||||||
val openSettings: () -> Unit,
|
|
||||||
) : TangemBottomSheetConfigContent
|
) : TangemBottomSheetConfigContent
|
||||||
|
|
@ -39,7 +39,6 @@ private fun PushNotificationsSheetContent(content: PushNotificationsBottomSheetC
|
||||||
val isClicked = remember { mutableStateOf(false) }
|
val isClicked = remember { mutableStateOf(false) }
|
||||||
val requestPushPermission = requestPushPermission(
|
val requestPushPermission = requestPushPermission(
|
||||||
pushPermission = getPushPermissionOrNull(),
|
pushPermission = getPushPermissionOrNull(),
|
||||||
isFirstTimeAsking = content.isFirstTimeRequested,
|
|
||||||
isClicked = isClicked,
|
isClicked = isClicked,
|
||||||
onAllow = {
|
onAllow = {
|
||||||
content.onAllow()
|
content.onAllow()
|
||||||
|
|
@ -49,7 +48,6 @@ private fun PushNotificationsSheetContent(content: PushNotificationsBottomSheetC
|
||||||
content.onDeny()
|
content.onDeny()
|
||||||
onDismiss()
|
onDismiss()
|
||||||
},
|
},
|
||||||
onOpenSettings = content.openSettings,
|
|
||||||
)
|
)
|
||||||
|
|
||||||
Column(modifier = Modifier.background(TangemTheme.colors.background.primary)) {
|
Column(modifier = Modifier.background(TangemTheme.colors.background.primary)) {
|
||||||
|
|
@ -78,13 +76,9 @@ private fun PushNotificationsSheetContent(content: PushNotificationsBottomSheetC
|
||||||
),
|
),
|
||||||
) {
|
) {
|
||||||
SecondaryButton(
|
SecondaryButton(
|
||||||
text = if (content.wasInitiallyAsk) {
|
text = stringResource(R.string.common_cancel),
|
||||||
stringResource(R.string.common_later)
|
|
||||||
} else {
|
|
||||||
stringResource(R.string.common_cancel)
|
|
||||||
},
|
|
||||||
onClick = {
|
onClick = {
|
||||||
content.onRequestLater()
|
content.onNeverRequest()
|
||||||
onDismiss()
|
onDismiss()
|
||||||
},
|
},
|
||||||
modifier = Modifier.weight(1f),
|
modifier = Modifier.weight(1f),
|
||||||
|
|
@ -110,13 +104,10 @@ private fun PushNotificationsSheetContent_Preview() {
|
||||||
TangemThemePreview {
|
TangemThemePreview {
|
||||||
PushNotificationsSheetContent(
|
PushNotificationsSheetContent(
|
||||||
PushNotificationsBottomSheetConfig(
|
PushNotificationsBottomSheetConfig(
|
||||||
isFirstTimeRequested = false,
|
|
||||||
wasInitiallyAsk = false,
|
|
||||||
onRequest = {},
|
onRequest = {},
|
||||||
onRequestLater = {},
|
onNeverRequest = {},
|
||||||
onAllow = {},
|
onAllow = {},
|
||||||
onDeny = {},
|
onDeny = {},
|
||||||
openSettings = {},
|
|
||||||
),
|
),
|
||||||
onDismiss = {},
|
onDismiss = {},
|
||||||
)
|
)
|
||||||
|
|
|
||||||
|
|
@ -5,7 +5,6 @@ import androidx.lifecycle.ViewModel
|
||||||
import androidx.lifecycle.viewModelScope
|
import androidx.lifecycle.viewModelScope
|
||||||
import arrow.core.getOrElse
|
import arrow.core.getOrElse
|
||||||
import com.tangem.core.analytics.api.AnalyticsEventHandler
|
import com.tangem.core.analytics.api.AnalyticsEventHandler
|
||||||
import com.tangem.core.navigation.settings.SettingsManager
|
|
||||||
import com.tangem.domain.balancehiding.GetBalanceHidingSettingsUseCase
|
import com.tangem.domain.balancehiding.GetBalanceHidingSettingsUseCase
|
||||||
import com.tangem.domain.settings.*
|
import com.tangem.domain.settings.*
|
||||||
import com.tangem.domain.tokens.RefreshMultiCurrencyWalletQuotesUseCase
|
import com.tangem.domain.tokens.RefreshMultiCurrencyWalletQuotesUseCase
|
||||||
|
|
@ -63,11 +62,8 @@ internal class WalletViewModel @Inject constructor(
|
||||||
private val walletDeepLinksHandler: WalletDeepLinksHandler,
|
private val walletDeepLinksHandler: WalletDeepLinksHandler,
|
||||||
private val walletNameMigrationUseCase: WalletNameMigrationUseCase,
|
private val walletNameMigrationUseCase: WalletNameMigrationUseCase,
|
||||||
private val refreshMultiCurrencyWalletQuotesUseCase: RefreshMultiCurrencyWalletQuotesUseCase,
|
private val refreshMultiCurrencyWalletQuotesUseCase: RefreshMultiCurrencyWalletQuotesUseCase,
|
||||||
private val shouldInitiallyAskPermissionUseCase: ShouldInitiallyAskPermissionUseCase,
|
|
||||||
private val isFirstTimeAskingPermissionUseCase: IsFirstTimeAskingPermissionUseCase,
|
|
||||||
private val shouldAskPermissionUseCase: ShouldAskPermissionUseCase,
|
private val shouldAskPermissionUseCase: ShouldAskPermissionUseCase,
|
||||||
private val pushNotificationsFeatureToggles: PushNotificationsFeatureToggles,
|
private val pushNotificationsFeatureToggles: PushNotificationsFeatureToggles,
|
||||||
private val settingsManager: SettingsManager,
|
|
||||||
analyticsEventsHandler: AnalyticsEventHandler,
|
analyticsEventsHandler: AnalyticsEventHandler,
|
||||||
) : ViewModel() {
|
) : ViewModel() {
|
||||||
|
|
||||||
|
|
@ -157,26 +153,14 @@ internal class WalletViewModel @Inject constructor(
|
||||||
|
|
||||||
delay(timeMillis = 1_800)
|
delay(timeMillis = 1_800)
|
||||||
|
|
||||||
val isFirstTimeRequested = isFirstTimeAskingPermissionUseCase(PUSH_PERMISSION).getOrElse { true }
|
|
||||||
val wasInitiallyAsk = shouldInitiallyAskPermissionUseCase(PUSH_PERMISSION).getOrElse { true }
|
|
||||||
val onRequestLater: (Boolean) -> Unit = { isUserDismissed ->
|
|
||||||
if (wasInitiallyAsk) {
|
|
||||||
clickIntents.onDelayAskPushPermission(isUserDismissed)
|
|
||||||
} else {
|
|
||||||
clickIntents.onNeverAskPushPermission(isUserDismissed)
|
|
||||||
}
|
|
||||||
}
|
|
||||||
stateHolder.showBottomSheet(
|
stateHolder.showBottomSheet(
|
||||||
content = PushNotificationsBottomSheetConfig(
|
content = PushNotificationsBottomSheetConfig(
|
||||||
isFirstTimeRequested = isFirstTimeRequested,
|
|
||||||
wasInitiallyAsk = wasInitiallyAsk,
|
|
||||||
onRequest = clickIntents::onRequestPushPermission,
|
onRequest = clickIntents::onRequestPushPermission,
|
||||||
onRequestLater = { onRequestLater(false) },
|
onNeverRequest = { clickIntents.onNeverAskPushPermission(false) },
|
||||||
onAllow = clickIntents::onAllowPushPermission,
|
onAllow = clickIntents::onAllowPushPermission,
|
||||||
onDeny = clickIntents::onDenyPushPermission,
|
onDeny = clickIntents::onDenyPushPermission,
|
||||||
openSettings = settingsManager::openSettings,
|
|
||||||
),
|
),
|
||||||
onDismiss = { onRequestLater(true) },
|
onDismiss = { clickIntents.onNeverAskPushPermission(true) },
|
||||||
)
|
)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
||||||
|
|
@ -2,9 +2,7 @@ package com.tangem.feature.wallet.presentation.wallet.viewmodels.intents
|
||||||
|
|
||||||
import com.tangem.core.analytics.api.AnalyticsEventHandler
|
import com.tangem.core.analytics.api.AnalyticsEventHandler
|
||||||
import com.tangem.core.analytics.models.AnalyticsParam
|
import com.tangem.core.analytics.models.AnalyticsParam
|
||||||
import com.tangem.domain.settings.DelayPermissionRequestUseCase
|
|
||||||
import com.tangem.domain.settings.NeverRequestPermissionUseCase
|
import com.tangem.domain.settings.NeverRequestPermissionUseCase
|
||||||
import com.tangem.domain.settings.SetFirstTimeAskingPermissionUseCase
|
|
||||||
import com.tangem.features.pushnotifications.api.analytics.PushNotificationAnalyticEvents
|
import com.tangem.features.pushnotifications.api.analytics.PushNotificationAnalyticEvents
|
||||||
import com.tangem.features.pushnotifications.api.utils.PUSH_PERMISSION
|
import com.tangem.features.pushnotifications.api.utils.PUSH_PERMISSION
|
||||||
import dagger.hilt.android.scopes.ViewModelScoped
|
import dagger.hilt.android.scopes.ViewModelScoped
|
||||||
|
|
@ -15,8 +13,6 @@ internal interface WalletPushPermissionClickIntents {
|
||||||
|
|
||||||
fun onRequestPushPermission()
|
fun onRequestPushPermission()
|
||||||
|
|
||||||
fun onDelayAskPushPermission(isUserDismissed: Boolean)
|
|
||||||
|
|
||||||
fun onNeverAskPushPermission(isUserDismissed: Boolean)
|
fun onNeverAskPushPermission(isUserDismissed: Boolean)
|
||||||
|
|
||||||
fun onDenyPushPermission()
|
fun onDenyPushPermission()
|
||||||
|
|
@ -26,9 +22,7 @@ internal interface WalletPushPermissionClickIntents {
|
||||||
|
|
||||||
@ViewModelScoped
|
@ViewModelScoped
|
||||||
internal class WalletPushPermissionClickIntentsImplementor @Inject constructor(
|
internal class WalletPushPermissionClickIntentsImplementor @Inject constructor(
|
||||||
private val setFirstTimeAskingPermissionUseCase: SetFirstTimeAskingPermissionUseCase,
|
|
||||||
private val neverRequestPermissionUseCase: NeverRequestPermissionUseCase,
|
private val neverRequestPermissionUseCase: NeverRequestPermissionUseCase,
|
||||||
private val delayPermissionRequestUseCase: DelayPermissionRequestUseCase,
|
|
||||||
private val analyticsEventHandler: AnalyticsEventHandler,
|
private val analyticsEventHandler: AnalyticsEventHandler,
|
||||||
) : BaseWalletClickIntents(), WalletPushPermissionClickIntents {
|
) : BaseWalletClickIntents(), WalletPushPermissionClickIntents {
|
||||||
|
|
||||||
|
|
@ -38,27 +32,13 @@ internal class WalletPushPermissionClickIntentsImplementor @Inject constructor(
|
||||||
analyticsEventHandler.send(
|
analyticsEventHandler.send(
|
||||||
PushNotificationAnalyticEvents.ButtonAllow(AnalyticsParam.ScreensSources.Main),
|
PushNotificationAnalyticEvents.ButtonAllow(AnalyticsParam.ScreensSources.Main),
|
||||||
)
|
)
|
||||||
viewModelScope.launch {
|
|
||||||
setFirstTimeAskingPermissionUseCase(PUSH_PERMISSION)
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
override fun onDelayAskPushPermission(isUserDismissed: Boolean) {
|
|
||||||
if (!isUserDismissedDialog) return
|
|
||||||
isUserDismissedDialog = isUserDismissed
|
|
||||||
viewModelScope.launch {
|
|
||||||
analyticsEventHandler.send(
|
|
||||||
PushNotificationAnalyticEvents.ButtonLater(AnalyticsParam.ScreensSources.Main),
|
|
||||||
)
|
|
||||||
delayPermissionRequestUseCase(PUSH_PERMISSION)
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
override fun onNeverAskPushPermission(isUserDismissed: Boolean) {
|
override fun onNeverAskPushPermission(isUserDismissed: Boolean) {
|
||||||
if (!isUserDismissedDialog) return
|
if (!isUserDismissedDialog) return
|
||||||
isUserDismissedDialog = isUserDismissed
|
isUserDismissedDialog = isUserDismissed
|
||||||
viewModelScope.launch {
|
viewModelScope.launch {
|
||||||
analyticsEventHandler.send(PushNotificationAnalyticEvents.ButtonCancel)
|
PushNotificationAnalyticEvents.ButtonCancel(AnalyticsParam.ScreensSources.Main)
|
||||||
neverRequestPermissionUseCase(PUSH_PERMISSION)
|
neverRequestPermissionUseCase(PUSH_PERMISSION)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
||||||
Loading…
Add table
Add a link
Reference in a new issue