Updated on 2026-08-14
This commit is contained in:
parent
38572c0a4e
commit
e323c7cc4a
24 changed files with 27 additions and 134 deletions
|
|
@ -149,7 +149,6 @@ dependencies {
|
||||||
implementation(projects.domain.quotes)
|
implementation(projects.domain.quotes)
|
||||||
implementation(projects.domain.notifications)
|
implementation(projects.domain.notifications)
|
||||||
implementation(projects.domain.notifications.models)
|
implementation(projects.domain.notifications.models)
|
||||||
implementation(projects.domain.notifications.toggles)
|
|
||||||
implementation(projects.domain.swap.models)
|
implementation(projects.domain.swap.models)
|
||||||
implementation(projects.domain.swap)
|
implementation(projects.domain.swap)
|
||||||
implementation(projects.domain.walletManager)
|
implementation(projects.domain.walletManager)
|
||||||
|
|
|
||||||
|
|
@ -1,11 +1,8 @@
|
||||||
package com.tangem.tap.di.domain
|
package com.tangem.tap.di.domain
|
||||||
|
|
||||||
import com.tangem.core.configtoggle.feature.FeatureTogglesManager
|
|
||||||
import com.tangem.domain.notifications.*
|
import com.tangem.domain.notifications.*
|
||||||
import com.tangem.domain.notifications.repository.NotificationsRepository
|
import com.tangem.domain.notifications.repository.NotificationsRepository
|
||||||
import com.tangem.domain.notifications.repository.PushNotificationsRepository
|
import com.tangem.domain.notifications.repository.PushNotificationsRepository
|
||||||
import com.tangem.domain.notifications.toggles.NotificationsFeatureToggles
|
|
||||||
import com.tangem.tap.domain.notifications.DefaultNotificationsFeatureToggles
|
|
||||||
import com.tangem.utils.notifications.PushNotificationsTokenProvider
|
import com.tangem.utils.notifications.PushNotificationsTokenProvider
|
||||||
import dagger.Module
|
import dagger.Module
|
||||||
import dagger.Provides
|
import dagger.Provides
|
||||||
|
|
@ -79,12 +76,6 @@ internal object NotificationsDomainModule {
|
||||||
)
|
)
|
||||||
}
|
}
|
||||||
|
|
||||||
@Provides
|
|
||||||
@Singleton
|
|
||||||
fun provideNotificationsFeatureToggles(featureTogglesManager: FeatureTogglesManager): NotificationsFeatureToggles {
|
|
||||||
return DefaultNotificationsFeatureToggles(featureTogglesManager = featureTogglesManager)
|
|
||||||
}
|
|
||||||
|
|
||||||
@Provides
|
@Provides
|
||||||
@Singleton
|
@Singleton
|
||||||
fun provideGetNetworksAvailableForNotifications(
|
fun provideGetNetworksAvailableForNotifications(
|
||||||
|
|
|
||||||
|
|
@ -1,11 +0,0 @@
|
||||||
package com.tangem.tap.domain.notifications
|
|
||||||
|
|
||||||
import com.tangem.core.configtoggle.feature.FeatureTogglesManager
|
|
||||||
import com.tangem.domain.notifications.toggles.NotificationsFeatureToggles
|
|
||||||
|
|
||||||
internal class DefaultNotificationsFeatureToggles(
|
|
||||||
private val featureTogglesManager: FeatureTogglesManager,
|
|
||||||
) : NotificationsFeatureToggles {
|
|
||||||
override val isNotificationsEnabled: Boolean
|
|
||||||
get() = featureTogglesManager.isFeatureEnabled("PUSH_NOTIFICATIONS_ENABLED")
|
|
||||||
}
|
|
||||||
|
|
@ -28,7 +28,6 @@ import com.tangem.domain.models.wallet.UserWallet
|
||||||
import com.tangem.domain.notifications.GetApplicationIdUseCase
|
import com.tangem.domain.notifications.GetApplicationIdUseCase
|
||||||
import com.tangem.domain.notifications.SendPushTokenUseCase
|
import com.tangem.domain.notifications.SendPushTokenUseCase
|
||||||
import com.tangem.domain.notifications.models.ApplicationId
|
import com.tangem.domain.notifications.models.ApplicationId
|
||||||
import com.tangem.domain.notifications.toggles.NotificationsFeatureToggles
|
|
||||||
import com.tangem.domain.onboarding.repository.OnboardingRepository
|
import com.tangem.domain.onboarding.repository.OnboardingRepository
|
||||||
import com.tangem.domain.onramp.FetchHotCryptoUseCase
|
import com.tangem.domain.onramp.FetchHotCryptoUseCase
|
||||||
import com.tangem.domain.promo.GetStoryContentUseCase
|
import com.tangem.domain.promo.GetStoryContentUseCase
|
||||||
|
|
@ -80,7 +79,6 @@ internal class MainViewModel @Inject constructor(
|
||||||
private val imagePreloader: ImagePreloader,
|
private val imagePreloader: ImagePreloader,
|
||||||
private val fetchHotCryptoUseCase: FetchHotCryptoUseCase,
|
private val fetchHotCryptoUseCase: FetchHotCryptoUseCase,
|
||||||
private val onboardingRepository: OnboardingRepository,
|
private val onboardingRepository: OnboardingRepository,
|
||||||
private val notificationsToggles: NotificationsFeatureToggles,
|
|
||||||
private val getApplicationIdUseCase: GetApplicationIdUseCase,
|
private val getApplicationIdUseCase: GetApplicationIdUseCase,
|
||||||
private val subscribeOnWalletsUseCase: GetSavedWalletsCountUseCase,
|
private val subscribeOnWalletsUseCase: GetSavedWalletsCountUseCase,
|
||||||
private val associateWalletsWithApplicationIdUseCase: AssociateWalletsWithApplicationIdUseCase,
|
private val associateWalletsWithApplicationIdUseCase: AssociateWalletsWithApplicationIdUseCase,
|
||||||
|
|
@ -415,18 +413,20 @@ internal class MainViewModel @Inject constructor(
|
||||||
}
|
}
|
||||||
|
|
||||||
private suspend fun initPushNotifications() {
|
private suspend fun initPushNotifications() {
|
||||||
if (notificationsToggles.isNotificationsEnabled) {
|
getApplicationIdUseCase()
|
||||||
getApplicationIdUseCase().onRight { applicationId ->
|
.onRight { applicationId ->
|
||||||
sendPushTokenUseCase(applicationId = applicationId)
|
sendPushTokenUseCase(applicationId = applicationId)
|
||||||
associateWalletsWithApplicationId(applicationId = applicationId)
|
associateWalletsWithApplicationId(applicationId = applicationId)
|
||||||
updateRemoteWalletsInfoUseCase(applicationId = applicationId)
|
updateRemoteWalletsInfoUseCase(applicationId = applicationId)
|
||||||
}.onLeft { Timber.e(it.toString()) }
|
|
||||||
}
|
}
|
||||||
|
.onLeft(Timber::e)
|
||||||
}
|
}
|
||||||
|
|
||||||
private fun associateWalletsWithApplicationId(applicationId: ApplicationId) {
|
private fun associateWalletsWithApplicationId(applicationId: ApplicationId) {
|
||||||
subscribeOnWalletsUseCase().onEach { wallets ->
|
subscribeOnWalletsUseCase()
|
||||||
|
.onEach { wallets ->
|
||||||
associateWalletsWithApplicationIdUseCase(applicationId, wallets)
|
associateWalletsWithApplicationIdUseCase(applicationId, wallets)
|
||||||
}.launchIn(viewModelScope)
|
}
|
||||||
|
.launchIn(viewModelScope)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
@ -23,10 +23,6 @@
|
||||||
"name": "WALLET_CONNECT_REDESIGN_ENABLED",
|
"name": "WALLET_CONNECT_REDESIGN_ENABLED",
|
||||||
"version": "5.27.0"
|
"version": "5.27.0"
|
||||||
},
|
},
|
||||||
{
|
|
||||||
"name": "PUSH_NOTIFICATIONS_ENABLED",
|
|
||||||
"version": "5.26.2"
|
|
||||||
},
|
|
||||||
{
|
{
|
||||||
"name": "USEDESK_ENABLED",
|
"name": "USEDESK_ENABLED",
|
||||||
"version": "undefined"
|
"version": "undefined"
|
||||||
|
|
|
||||||
|
|
@ -25,7 +25,6 @@ dependencies {
|
||||||
implementation(projects.domain.models)
|
implementation(projects.domain.models)
|
||||||
implementation(projects.domain.tokens.models)
|
implementation(projects.domain.tokens.models)
|
||||||
implementation(projects.domain.wallets.models)
|
implementation(projects.domain.wallets.models)
|
||||||
implementation(projects.domain.notifications.toggles)
|
|
||||||
implementation(projects.domain.networks)
|
implementation(projects.domain.networks)
|
||||||
implementation(projects.domain.wallets)
|
implementation(projects.domain.wallets)
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -5,7 +5,6 @@ import com.tangem.domain.models.network.NetworkStatus
|
||||||
import com.tangem.domain.models.wallet.UserWalletId
|
import com.tangem.domain.models.wallet.UserWalletId
|
||||||
import com.tangem.domain.networks.multi.MultiNetworkStatusProducer
|
import com.tangem.domain.networks.multi.MultiNetworkStatusProducer
|
||||||
import com.tangem.domain.networks.multi.MultiNetworkStatusSupplier
|
import com.tangem.domain.networks.multi.MultiNetworkStatusSupplier
|
||||||
import com.tangem.domain.notifications.toggles.NotificationsFeatureToggles
|
|
||||||
import com.tangem.domain.wallets.repository.WalletsRepository
|
import com.tangem.domain.wallets.repository.WalletsRepository
|
||||||
import com.tangem.utils.coroutines.CoroutineDispatcherProvider
|
import com.tangem.utils.coroutines.CoroutineDispatcherProvider
|
||||||
import kotlinx.coroutines.flow.first
|
import kotlinx.coroutines.flow.first
|
||||||
|
|
@ -15,17 +14,12 @@ import javax.inject.Inject
|
||||||
import kotlin.time.Duration.Companion.seconds
|
import kotlin.time.Duration.Companion.seconds
|
||||||
|
|
||||||
class UserTokensResponseAddressesEnricher @Inject constructor(
|
class UserTokensResponseAddressesEnricher @Inject constructor(
|
||||||
private val notificationsFeatureToggles: NotificationsFeatureToggles,
|
|
||||||
private val walletsRepository: WalletsRepository,
|
private val walletsRepository: WalletsRepository,
|
||||||
private val dispatchers: CoroutineDispatcherProvider,
|
private val dispatchers: CoroutineDispatcherProvider,
|
||||||
private val multiNetworkStatusSupplier: MultiNetworkStatusSupplier,
|
private val multiNetworkStatusSupplier: MultiNetworkStatusSupplier,
|
||||||
) {
|
) {
|
||||||
|
|
||||||
suspend operator fun invoke(userWalletId: UserWalletId, response: UserTokensResponse): UserTokensResponse {
|
suspend operator fun invoke(userWalletId: UserWalletId, response: UserTokensResponse): UserTokensResponse {
|
||||||
if (!notificationsFeatureToggles.isNotificationsEnabled) {
|
|
||||||
return response
|
|
||||||
}
|
|
||||||
|
|
||||||
val isNotificationsEnabled = walletsRepository.isNotificationsEnabled(userWalletId)
|
val isNotificationsEnabled = walletsRepository.isNotificationsEnabled(userWalletId)
|
||||||
|
|
||||||
return withContext(dispatchers.default) {
|
return withContext(dispatchers.default) {
|
||||||
|
|
|
||||||
|
|
@ -9,7 +9,6 @@ import com.tangem.datasource.local.token.UserTokensResponseStore
|
||||||
import com.tangem.datasource.local.userwallet.UserWalletsStore
|
import com.tangem.datasource.local.userwallet.UserWalletsStore
|
||||||
import com.tangem.domain.demo.models.DemoConfig
|
import com.tangem.domain.demo.models.DemoConfig
|
||||||
import com.tangem.domain.networks.multi.MultiNetworkStatusSupplier
|
import com.tangem.domain.networks.multi.MultiNetworkStatusSupplier
|
||||||
import com.tangem.domain.notifications.toggles.NotificationsFeatureToggles
|
|
||||||
import com.tangem.domain.wallets.repository.WalletsRepository
|
import com.tangem.domain.wallets.repository.WalletsRepository
|
||||||
import com.tangem.utils.coroutines.CoroutineDispatcherProvider
|
import com.tangem.utils.coroutines.CoroutineDispatcherProvider
|
||||||
import dagger.Module
|
import dagger.Module
|
||||||
|
|
@ -42,13 +41,11 @@ internal object DataCommonModule {
|
||||||
@Provides
|
@Provides
|
||||||
@Singleton
|
@Singleton
|
||||||
fun provideUserTokensEncricher(
|
fun provideUserTokensEncricher(
|
||||||
notificationsFeatureToggles: NotificationsFeatureToggles,
|
|
||||||
walletsRepository: WalletsRepository,
|
walletsRepository: WalletsRepository,
|
||||||
multiNetworkStatusSupplier: MultiNetworkStatusSupplier,
|
multiNetworkStatusSupplier: MultiNetworkStatusSupplier,
|
||||||
dispatchers: CoroutineDispatcherProvider,
|
dispatchers: CoroutineDispatcherProvider,
|
||||||
): UserTokensResponseAddressesEnricher {
|
): UserTokensResponseAddressesEnricher {
|
||||||
return UserTokensResponseAddressesEnricher(
|
return UserTokensResponseAddressesEnricher(
|
||||||
notificationsFeatureToggles = notificationsFeatureToggles,
|
|
||||||
walletsRepository = walletsRepository,
|
walletsRepository = walletsRepository,
|
||||||
multiNetworkStatusSupplier = multiNetworkStatusSupplier,
|
multiNetworkStatusSupplier = multiNetworkStatusSupplier,
|
||||||
dispatchers = dispatchers,
|
dispatchers = dispatchers,
|
||||||
|
|
|
||||||
|
|
@ -7,7 +7,6 @@ import com.tangem.domain.models.network.NetworkAddress
|
||||||
import com.tangem.domain.models.network.NetworkStatus
|
import com.tangem.domain.models.network.NetworkStatus
|
||||||
import com.tangem.domain.models.wallet.UserWalletId
|
import com.tangem.domain.models.wallet.UserWalletId
|
||||||
import com.tangem.domain.networks.multi.MultiNetworkStatusSupplier
|
import com.tangem.domain.networks.multi.MultiNetworkStatusSupplier
|
||||||
import com.tangem.domain.notifications.toggles.NotificationsFeatureToggles
|
|
||||||
import com.tangem.domain.wallets.repository.WalletsRepository
|
import com.tangem.domain.wallets.repository.WalletsRepository
|
||||||
import com.tangem.utils.coroutines.CoroutineDispatcherProvider
|
import com.tangem.utils.coroutines.CoroutineDispatcherProvider
|
||||||
import com.tangem.utils.coroutines.TestingCoroutineDispatcherProvider
|
import com.tangem.utils.coroutines.TestingCoroutineDispatcherProvider
|
||||||
|
|
@ -23,7 +22,6 @@ import org.junit.Test
|
||||||
|
|
||||||
class UserTokensResponseAddressesEnricherTest {
|
class UserTokensResponseAddressesEnricherTest {
|
||||||
|
|
||||||
private lateinit var notificationsFeatureToggles: NotificationsFeatureToggles
|
|
||||||
private lateinit var walletsRepository: WalletsRepository
|
private lateinit var walletsRepository: WalletsRepository
|
||||||
private val dispatchers: CoroutineDispatcherProvider = TestingCoroutineDispatcherProvider()
|
private val dispatchers: CoroutineDispatcherProvider = TestingCoroutineDispatcherProvider()
|
||||||
private lateinit var multiNetworkStatusSupplier: MultiNetworkStatusSupplier
|
private lateinit var multiNetworkStatusSupplier: MultiNetworkStatusSupplier
|
||||||
|
|
@ -31,12 +29,10 @@ class UserTokensResponseAddressesEnricherTest {
|
||||||
|
|
||||||
@Before
|
@Before
|
||||||
fun setup() {
|
fun setup() {
|
||||||
notificationsFeatureToggles = mockk()
|
|
||||||
walletsRepository = mockk()
|
walletsRepository = mockk()
|
||||||
multiNetworkStatusSupplier = mockk()
|
multiNetworkStatusSupplier = mockk()
|
||||||
|
|
||||||
enricher = UserTokensResponseAddressesEnricher(
|
enricher = UserTokensResponseAddressesEnricher(
|
||||||
notificationsFeatureToggles = notificationsFeatureToggles,
|
|
||||||
walletsRepository = walletsRepository,
|
walletsRepository = walletsRepository,
|
||||||
dispatchers = dispatchers,
|
dispatchers = dispatchers,
|
||||||
multiNetworkStatusSupplier = multiNetworkStatusSupplier,
|
multiNetworkStatusSupplier = multiNetworkStatusSupplier,
|
||||||
|
|
@ -54,7 +50,6 @@ class UserTokensResponseAddressesEnricherTest {
|
||||||
val userWalletId = UserWalletId("1234567890abcdef")
|
val userWalletId = UserWalletId("1234567890abcdef")
|
||||||
val token = createToken()
|
val token = createToken()
|
||||||
val response = createUserTokensResponse(tokens = listOf(token))
|
val response = createUserTokensResponse(tokens = listOf(token))
|
||||||
every { notificationsFeatureToggles.isNotificationsEnabled } returns false
|
|
||||||
|
|
||||||
// WHEN
|
// WHEN
|
||||||
val result = enricher(userWalletId, response)
|
val result = enricher(userWalletId, response)
|
||||||
|
|
@ -70,7 +65,6 @@ class UserTokensResponseAddressesEnricherTest {
|
||||||
val userWalletId = UserWalletId("1234567890abcdef")
|
val userWalletId = UserWalletId("1234567890abcdef")
|
||||||
val token = createToken()
|
val token = createToken()
|
||||||
val response = createUserTokensResponse(tokens = listOf(token))
|
val response = createUserTokensResponse(tokens = listOf(token))
|
||||||
every { notificationsFeatureToggles.isNotificationsEnabled } returns true
|
|
||||||
coEvery { walletsRepository.isNotificationsEnabled(userWalletId) } returns false
|
coEvery { walletsRepository.isNotificationsEnabled(userWalletId) } returns false
|
||||||
coEvery {
|
coEvery {
|
||||||
multiNetworkStatusSupplier.invoke(any())
|
multiNetworkStatusSupplier.invoke(any())
|
||||||
|
|
@ -110,7 +104,6 @@ class UserTokensResponseAddressesEnricherTest {
|
||||||
val response = createUserTokensResponse(tokens = listOf(token))
|
val response = createUserTokensResponse(tokens = listOf(token))
|
||||||
val addresses = listOf("0x123", "0x456")
|
val addresses = listOf("0x123", "0x456")
|
||||||
|
|
||||||
every { notificationsFeatureToggles.isNotificationsEnabled } returns true
|
|
||||||
coEvery { walletsRepository.isNotificationsEnabled(userWalletId) } returns true
|
coEvery { walletsRepository.isNotificationsEnabled(userWalletId) } returns true
|
||||||
coEvery {
|
coEvery {
|
||||||
multiNetworkStatusSupplier.invoke(any())
|
multiNetworkStatusSupplier.invoke(any())
|
||||||
|
|
@ -152,7 +145,6 @@ class UserTokensResponseAddressesEnricherTest {
|
||||||
val token = createToken()
|
val token = createToken()
|
||||||
val response = createUserTokensResponse(tokens = listOf(token))
|
val response = createUserTokensResponse(tokens = listOf(token))
|
||||||
|
|
||||||
every { notificationsFeatureToggles.isNotificationsEnabled } returns true
|
|
||||||
coEvery { walletsRepository.isNotificationsEnabled(userWalletId) } returns true
|
coEvery { walletsRepository.isNotificationsEnabled(userWalletId) } returns true
|
||||||
coEvery {
|
coEvery {
|
||||||
multiNetworkStatusSupplier.invoke(any())
|
multiNetworkStatusSupplier.invoke(any())
|
||||||
|
|
|
||||||
1
domain/notifications/toggles/.gitignore
vendored
1
domain/notifications/toggles/.gitignore
vendored
|
|
@ -1 +0,0 @@
|
||||||
/build
|
|
||||||
|
|
@ -1,4 +0,0 @@
|
||||||
plugins {
|
|
||||||
alias(deps.plugins.kotlin.jvm)
|
|
||||||
id("configuration")
|
|
||||||
}
|
|
||||||
|
|
@ -1,5 +0,0 @@
|
||||||
package com.tangem.domain.notifications.toggles
|
|
||||||
|
|
||||||
interface NotificationsFeatureToggles {
|
|
||||||
val isNotificationsEnabled: Boolean
|
|
||||||
}
|
|
||||||
|
|
@ -40,7 +40,6 @@ dependencies {
|
||||||
|
|
||||||
/** Domain module */
|
/** Domain module */
|
||||||
implementation(projects.domain.settings)
|
implementation(projects.domain.settings)
|
||||||
implementation(projects.domain.notifications.toggles)
|
|
||||||
implementation(projects.domain.notifications)
|
implementation(projects.domain.notifications)
|
||||||
|
|
||||||
/** Feature modules */
|
/** Feature modules */
|
||||||
|
|
|
||||||
|
|
@ -1,8 +1,6 @@
|
||||||
package com.tangem.features.pushnotifications.impl
|
package com.tangem.features.pushnotifications.impl
|
||||||
|
|
||||||
import androidx.compose.runtime.Composable
|
import androidx.compose.runtime.Composable
|
||||||
import androidx.compose.runtime.collectAsState
|
|
||||||
import androidx.compose.runtime.getValue
|
|
||||||
import androidx.compose.runtime.remember
|
import androidx.compose.runtime.remember
|
||||||
import com.tangem.core.decompose.context.AppComponentContext
|
import com.tangem.core.decompose.context.AppComponentContext
|
||||||
import com.tangem.core.decompose.model.getOrCreateModel
|
import com.tangem.core.decompose.model.getOrCreateModel
|
||||||
|
|
@ -38,7 +36,6 @@ internal class DefaultPushNotificationsBottomSheetComponent @AssistedInject cons
|
||||||
|
|
||||||
@Composable
|
@Composable
|
||||||
override fun BottomSheet() {
|
override fun BottomSheet() {
|
||||||
val state by model.state.collectAsState()
|
|
||||||
val bottomSheetConfig = remember(key1 = this) {
|
val bottomSheetConfig = remember(key1 = this) {
|
||||||
TangemBottomSheetConfig(
|
TangemBottomSheetConfig(
|
||||||
isShown = true,
|
isShown = true,
|
||||||
|
|
@ -55,7 +52,6 @@ internal class DefaultPushNotificationsBottomSheetComponent @AssistedInject cons
|
||||||
onLaterClick = model::onLaterClick,
|
onLaterClick = model::onLaterClick,
|
||||||
onAllowPermission = model::onAllowPermission,
|
onAllowPermission = model::onAllowPermission,
|
||||||
onDenyPermission = model::onDenyPermission,
|
onDenyPermission = model::onDenyPermission,
|
||||||
showNotificationsInfo = state.showInfoAboutNotifications,
|
|
||||||
)
|
)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
||||||
|
|
@ -2,8 +2,6 @@ package com.tangem.features.pushnotifications.impl
|
||||||
|
|
||||||
import androidx.activity.compose.BackHandler
|
import androidx.activity.compose.BackHandler
|
||||||
import androidx.compose.runtime.Composable
|
import androidx.compose.runtime.Composable
|
||||||
import androidx.compose.runtime.collectAsState
|
|
||||||
import androidx.compose.runtime.getValue
|
|
||||||
import androidx.compose.ui.Modifier
|
import androidx.compose.ui.Modifier
|
||||||
import androidx.compose.ui.platform.LocalContext
|
import androidx.compose.ui.platform.LocalContext
|
||||||
import com.tangem.core.decompose.context.AppComponentContext
|
import com.tangem.core.decompose.context.AppComponentContext
|
||||||
|
|
@ -28,15 +26,15 @@ internal class DefaultPushNotificationsComponent @AssistedInject constructor(
|
||||||
@Composable
|
@Composable
|
||||||
override fun Content(modifier: Modifier) {
|
override fun Content(modifier: Modifier) {
|
||||||
val activity = LocalContext.current.findActivity()
|
val activity = LocalContext.current.findActivity()
|
||||||
val state by model.state.collectAsState()
|
|
||||||
BackHandler(onBack = { activity.finish() })
|
BackHandler(onBack = { activity.finish() })
|
||||||
NavigationBar3ButtonsScrim()
|
NavigationBar3ButtonsScrim()
|
||||||
|
|
||||||
PushNotificationsScreen(
|
PushNotificationsScreen(
|
||||||
onAllowClick = model::onAllowClick,
|
onAllowClick = model::onAllowClick,
|
||||||
onLaterClick = model::onLaterClick,
|
onLaterClick = model::onLaterClick,
|
||||||
onAllowPermission = model::onAllowPermission,
|
onAllowPermission = model::onAllowPermission,
|
||||||
onDenyPermission = model::onDenyPermission,
|
onDenyPermission = model::onDenyPermission,
|
||||||
showNotificationsInfo = state.showInfoAboutNotifications,
|
|
||||||
)
|
)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -9,16 +9,12 @@ import com.tangem.core.decompose.di.ModelScoped
|
||||||
import com.tangem.core.decompose.model.Model
|
import com.tangem.core.decompose.model.Model
|
||||||
import com.tangem.core.decompose.model.ParamsContainer
|
import com.tangem.core.decompose.model.ParamsContainer
|
||||||
import com.tangem.domain.notifications.repository.NotificationsRepository
|
import com.tangem.domain.notifications.repository.NotificationsRepository
|
||||||
import com.tangem.domain.notifications.toggles.NotificationsFeatureToggles
|
|
||||||
import com.tangem.domain.settings.NeverRequestPermissionUseCase
|
import com.tangem.domain.settings.NeverRequestPermissionUseCase
|
||||||
import com.tangem.domain.settings.NeverToInitiallyAskPermissionUseCase
|
import com.tangem.domain.settings.NeverToInitiallyAskPermissionUseCase
|
||||||
import com.tangem.features.pushnotifications.api.PushNotificationsParams
|
import com.tangem.features.pushnotifications.api.PushNotificationsParams
|
||||||
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.presentation.state.PushNotificationsUM
|
|
||||||
import com.tangem.utils.coroutines.CoroutineDispatcherProvider
|
import com.tangem.utils.coroutines.CoroutineDispatcherProvider
|
||||||
import kotlinx.coroutines.flow.MutableStateFlow
|
|
||||||
import kotlinx.coroutines.flow.asStateFlow
|
|
||||||
import kotlinx.coroutines.launch
|
import kotlinx.coroutines.launch
|
||||||
import javax.inject.Inject
|
import javax.inject.Inject
|
||||||
|
|
||||||
|
|
@ -32,7 +28,6 @@ internal class PushNotificationsModel @Inject constructor(
|
||||||
private val neverToInitiallyAskPermissionUseCase: NeverToInitiallyAskPermissionUseCase,
|
private val neverToInitiallyAskPermissionUseCase: NeverToInitiallyAskPermissionUseCase,
|
||||||
private val appRouter: AppRouter,
|
private val appRouter: AppRouter,
|
||||||
private val analyticHandler: AnalyticsEventHandler,
|
private val analyticHandler: AnalyticsEventHandler,
|
||||||
private val notificationsFeatureToggles: NotificationsFeatureToggles,
|
|
||||||
private val notificationsRepository: NotificationsRepository,
|
private val notificationsRepository: NotificationsRepository,
|
||||||
) : Model(), PushNotificationsClickIntents {
|
) : Model(), PushNotificationsClickIntents {
|
||||||
|
|
||||||
|
|
@ -43,33 +38,22 @@ internal class PushNotificationsModel @Inject constructor(
|
||||||
AppRoute.PushNotification.Source.Onboarding -> AnalyticsParam.ScreensSources.Onboarding
|
AppRoute.PushNotification.Source.Onboarding -> AnalyticsParam.ScreensSources.Onboarding
|
||||||
}
|
}
|
||||||
|
|
||||||
private val _state = MutableStateFlow(
|
|
||||||
PushNotificationsUM(
|
|
||||||
showInfoAboutNotifications = notificationsFeatureToggles.isNotificationsEnabled,
|
|
||||||
),
|
|
||||||
)
|
|
||||||
|
|
||||||
init {
|
init {
|
||||||
analyticHandler.send(PushNotificationAnalyticEvents.NotificationsScreenOpened(source))
|
analyticHandler.send(PushNotificationAnalyticEvents.NotificationsScreenOpened(source))
|
||||||
}
|
}
|
||||||
|
|
||||||
val state = _state.asStateFlow()
|
|
||||||
|
|
||||||
override fun onAllowClick() {
|
override fun onAllowClick() {
|
||||||
if (notificationsFeatureToggles.isNotificationsEnabled) {
|
|
||||||
modelScope.launch {
|
modelScope.launch {
|
||||||
notificationsRepository.setUserAllowToSubscribeOnPushNotifications(true)
|
notificationsRepository.setUserAllowToSubscribeOnPushNotifications(true)
|
||||||
}
|
}
|
||||||
}
|
|
||||||
analyticHandler.send(PushNotificationAnalyticEvents.ButtonAllow(source))
|
analyticHandler.send(PushNotificationAnalyticEvents.ButtonAllow(source))
|
||||||
}
|
}
|
||||||
|
|
||||||
override fun onLaterClick() {
|
override fun onLaterClick() {
|
||||||
if (notificationsFeatureToggles.isNotificationsEnabled) {
|
|
||||||
modelScope.launch {
|
modelScope.launch {
|
||||||
notificationsRepository.setUserAllowToSubscribeOnPushNotifications(false)
|
notificationsRepository.setUserAllowToSubscribeOnPushNotifications(false)
|
||||||
}
|
}
|
||||||
}
|
|
||||||
analyticHandler.send(PushNotificationAnalyticEvents.ButtonLater(source))
|
analyticHandler.send(PushNotificationAnalyticEvents.ButtonLater(source))
|
||||||
modelScope.launch {
|
modelScope.launch {
|
||||||
neverRequestPermissionUseCase(PUSH_PERMISSION)
|
neverRequestPermissionUseCase(PUSH_PERMISSION)
|
||||||
|
|
|
||||||
|
|
@ -1,5 +0,0 @@
|
||||||
package com.tangem.features.pushnotifications.impl.presentation.state
|
|
||||||
|
|
||||||
data class PushNotificationsUM(
|
|
||||||
val showInfoAboutNotifications: Boolean = false,
|
|
||||||
)
|
|
||||||
|
|
@ -44,7 +44,6 @@ internal fun PushNotificationsContent(
|
||||||
onLaterClick: () -> Unit,
|
onLaterClick: () -> Unit,
|
||||||
onAllowPermission: () -> Unit,
|
onAllowPermission: () -> Unit,
|
||||||
onDenyPermission: () -> Unit,
|
onDenyPermission: () -> Unit,
|
||||||
showNotificationsInfo: Boolean,
|
|
||||||
) {
|
) {
|
||||||
val requestPushPermission = requestPermission(
|
val requestPushPermission = requestPermission(
|
||||||
onAllow = onAllowPermission,
|
onAllow = onAllowPermission,
|
||||||
|
|
@ -65,18 +64,11 @@ internal fun PushNotificationsContent(
|
||||||
R.drawable.ic_storefront_24,
|
R.drawable.ic_storefront_24,
|
||||||
resourceReference(R.string.user_push_notification_agreement_argument_two),
|
resourceReference(R.string.user_push_notification_agreement_argument_two),
|
||||||
),
|
),
|
||||||
).let { baseItems ->
|
|
||||||
if (showNotificationsInfo) {
|
|
||||||
baseItems.add(
|
|
||||||
ShowcaseItemModel(
|
ShowcaseItemModel(
|
||||||
R.drawable.ic_notifications_24,
|
R.drawable.ic_notifications_24,
|
||||||
resourceReference(R.string.user_push_notification_agreement_argument_three),
|
resourceReference(R.string.user_push_notification_agreement_argument_three),
|
||||||
),
|
),
|
||||||
)
|
),
|
||||||
} else {
|
|
||||||
baseItems
|
|
||||||
}
|
|
||||||
},
|
|
||||||
modifier = Modifier.padding(top = TangemTheme.dimens.spacing40),
|
modifier = Modifier.padding(top = TangemTheme.dimens.spacing40),
|
||||||
)
|
)
|
||||||
SpacerH28()
|
SpacerH28()
|
||||||
|
|
@ -111,7 +103,6 @@ private fun Preview_PushNotificationsBottomSheet() {
|
||||||
onLaterClick = {},
|
onLaterClick = {},
|
||||||
onAllowPermission = {},
|
onAllowPermission = {},
|
||||||
onDenyPermission = {},
|
onDenyPermission = {},
|
||||||
showNotificationsInfo = true,
|
|
||||||
)
|
)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
||||||
|
|
@ -18,7 +18,6 @@ internal fun PushNotificationsScreen(
|
||||||
onLaterClick: () -> Unit,
|
onLaterClick: () -> Unit,
|
||||||
onAllowPermission: () -> Unit,
|
onAllowPermission: () -> Unit,
|
||||||
onDenyPermission: () -> Unit,
|
onDenyPermission: () -> Unit,
|
||||||
showNotificationsInfo: Boolean,
|
|
||||||
) {
|
) {
|
||||||
val requestPushPermission = requestPermission(
|
val requestPushPermission = requestPermission(
|
||||||
onAllow = onAllowPermission,
|
onAllow = onAllowPermission,
|
||||||
|
|
@ -38,18 +37,11 @@ internal fun PushNotificationsScreen(
|
||||||
R.drawable.ic_storefront_24,
|
R.drawable.ic_storefront_24,
|
||||||
resourceReference(R.string.user_push_notification_agreement_argument_two),
|
resourceReference(R.string.user_push_notification_agreement_argument_two),
|
||||||
),
|
),
|
||||||
).let { baseItems ->
|
|
||||||
if (showNotificationsInfo) {
|
|
||||||
baseItems.add(
|
|
||||||
ShowcaseItemModel(
|
ShowcaseItemModel(
|
||||||
R.drawable.ic_notifications_24,
|
R.drawable.ic_notifications_24,
|
||||||
resourceReference(R.string.user_push_notification_agreement_argument_three),
|
resourceReference(R.string.user_push_notification_agreement_argument_three),
|
||||||
),
|
),
|
||||||
)
|
),
|
||||||
} else {
|
|
||||||
baseItems
|
|
||||||
}
|
|
||||||
},
|
|
||||||
primaryButton = ShowcaseButtonModel(
|
primaryButton = ShowcaseButtonModel(
|
||||||
buttonText = resourceReference(R.string.common_allow),
|
buttonText = resourceReference(R.string.common_allow),
|
||||||
onClick = {
|
onClick = {
|
||||||
|
|
|
||||||
|
|
@ -41,7 +41,6 @@ dependencies {
|
||||||
implementation(projects.domain.demo)
|
implementation(projects.domain.demo)
|
||||||
implementation(projects.domain.nft)
|
implementation(projects.domain.nft)
|
||||||
implementation(projects.domain.settings)
|
implementation(projects.domain.settings)
|
||||||
implementation(projects.domain.notifications.toggles)
|
|
||||||
implementation(projects.domain.notifications.models)
|
implementation(projects.domain.notifications.models)
|
||||||
implementation(projects.domain.notifications)
|
implementation(projects.domain.notifications)
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -32,7 +32,6 @@ import com.tangem.domain.nft.EnableWalletNFTUseCase
|
||||||
import com.tangem.domain.nft.GetWalletNFTEnabledUseCase
|
import com.tangem.domain.nft.GetWalletNFTEnabledUseCase
|
||||||
import com.tangem.domain.notifications.GetIsHuaweiDeviceWithoutGoogleServicesUseCase
|
import com.tangem.domain.notifications.GetIsHuaweiDeviceWithoutGoogleServicesUseCase
|
||||||
import com.tangem.domain.notifications.repository.NotificationsRepository
|
import com.tangem.domain.notifications.repository.NotificationsRepository
|
||||||
import com.tangem.domain.notifications.toggles.NotificationsFeatureToggles
|
|
||||||
import com.tangem.domain.settings.repositories.PermissionRepository
|
import com.tangem.domain.settings.repositories.PermissionRepository
|
||||||
import com.tangem.domain.wallets.usecase.*
|
import com.tangem.domain.wallets.usecase.*
|
||||||
import com.tangem.feature.walletsettings.analytics.Settings
|
import com.tangem.feature.walletsettings.analytics.Settings
|
||||||
|
|
@ -73,7 +72,6 @@ internal class WalletSettingsModel @Inject constructor(
|
||||||
getWalletNFTEnabledUseCase: GetWalletNFTEnabledUseCase,
|
getWalletNFTEnabledUseCase: GetWalletNFTEnabledUseCase,
|
||||||
private val enableWalletNFTUseCase: EnableWalletNFTUseCase,
|
private val enableWalletNFTUseCase: EnableWalletNFTUseCase,
|
||||||
private val disableWalletNFTUseCase: DisableWalletNFTUseCase,
|
private val disableWalletNFTUseCase: DisableWalletNFTUseCase,
|
||||||
private val notificationsToggles: NotificationsFeatureToggles,
|
|
||||||
getWalletNotificationsEnabledUseCase: GetWalletNotificationsEnabledUseCase,
|
getWalletNotificationsEnabledUseCase: GetWalletNotificationsEnabledUseCase,
|
||||||
private val setNotificationsEnabledUseCase: SetNotificationsEnabledUseCase,
|
private val setNotificationsEnabledUseCase: SetNotificationsEnabledUseCase,
|
||||||
private val settingsManager: SettingsManager,
|
private val settingsManager: SettingsManager,
|
||||||
|
|
@ -130,8 +128,7 @@ internal class WalletSettingsModel @Inject constructor(
|
||||||
is UserWallet.Hot -> wallet.backedUp
|
is UserWallet.Hot -> wallet.backedUp
|
||||||
is UserWallet.Cold -> true
|
is UserWallet.Cold -> true
|
||||||
}
|
}
|
||||||
val isNeedShowNotifications = notificationsToggles.isNotificationsEnabled &&
|
val isNeedShowNotifications = !getIsHuaweiDeviceWithoutGoogleServicesUseCase()
|
||||||
!getIsHuaweiDeviceWithoutGoogleServicesUseCase()
|
|
||||||
state.update { value ->
|
state.update { value ->
|
||||||
value.copy(
|
value.copy(
|
||||||
items = buildItems(
|
items = buildItems(
|
||||||
|
|
|
||||||
|
|
@ -95,7 +95,6 @@ dependencies {
|
||||||
implementation(projects.domain.wallets)
|
implementation(projects.domain.wallets)
|
||||||
implementation(projects.domain.wallets.models)
|
implementation(projects.domain.wallets.models)
|
||||||
implementation(projects.domain.notifications)
|
implementation(projects.domain.notifications)
|
||||||
implementation(projects.domain.notifications.toggles)
|
|
||||||
implementation(projects.domain.transaction)
|
implementation(projects.domain.transaction)
|
||||||
|
|
||||||
/** Feature Apis */
|
/** Feature Apis */
|
||||||
|
|
|
||||||
|
|
@ -17,7 +17,6 @@ import com.tangem.domain.models.wallet.isMultiCurrency
|
||||||
import com.tangem.domain.nft.ObserveAndClearNFTCacheIfNeedUseCase
|
import com.tangem.domain.nft.ObserveAndClearNFTCacheIfNeedUseCase
|
||||||
import com.tangem.domain.notifications.GetIsHuaweiDeviceWithoutGoogleServicesUseCase
|
import com.tangem.domain.notifications.GetIsHuaweiDeviceWithoutGoogleServicesUseCase
|
||||||
import com.tangem.domain.notifications.repository.NotificationsRepository
|
import com.tangem.domain.notifications.repository.NotificationsRepository
|
||||||
import com.tangem.domain.notifications.toggles.NotificationsFeatureToggles
|
|
||||||
import com.tangem.domain.settings.*
|
import com.tangem.domain.settings.*
|
||||||
import com.tangem.domain.tokens.RefreshMultiCurrencyWalletQuotesUseCase
|
import com.tangem.domain.tokens.RefreshMultiCurrencyWalletQuotesUseCase
|
||||||
import com.tangem.domain.wallets.usecase.*
|
import com.tangem.domain.wallets.usecase.*
|
||||||
|
|
@ -79,7 +78,6 @@ internal class WalletModel @Inject constructor(
|
||||||
private val notificationsRepository: NotificationsRepository,
|
private val notificationsRepository: NotificationsRepository,
|
||||||
private val getWalletsListForEnablingUseCase: GetWalletsForAutomaticallyPushEnablingUseCase,
|
private val getWalletsListForEnablingUseCase: GetWalletsForAutomaticallyPushEnablingUseCase,
|
||||||
private val setNotificationsEnabledUseCase: SetNotificationsEnabledUseCase,
|
private val setNotificationsEnabledUseCase: SetNotificationsEnabledUseCase,
|
||||||
private val notificationsFeatureToggles: NotificationsFeatureToggles,
|
|
||||||
private val shouldSaveUserWalletsSyncUseCase: ShouldSaveUserWalletsSyncUseCase,
|
private val shouldSaveUserWalletsSyncUseCase: ShouldSaveUserWalletsSyncUseCase,
|
||||||
private val getIsHuaweiDeviceWithoutGoogleServicesUseCase: GetIsHuaweiDeviceWithoutGoogleServicesUseCase,
|
private val getIsHuaweiDeviceWithoutGoogleServicesUseCase: GetIsHuaweiDeviceWithoutGoogleServicesUseCase,
|
||||||
val screenLifecycleProvider: ScreenLifecycleProvider,
|
val screenLifecycleProvider: ScreenLifecycleProvider,
|
||||||
|
|
@ -575,7 +573,6 @@ internal class WalletModel @Inject constructor(
|
||||||
}
|
}
|
||||||
|
|
||||||
private fun enableNotificationsIfNeeded() {
|
private fun enableNotificationsIfNeeded() {
|
||||||
if (!notificationsFeatureToggles.isNotificationsEnabled) return
|
|
||||||
modelScope.launch {
|
modelScope.launch {
|
||||||
val isUserAllowToEnableNotifications = notificationsRepository.isUserAllowToSubscribeOnPushNotifications()
|
val isUserAllowToEnableNotifications = notificationsRepository.isUserAllowToSubscribeOnPushNotifications()
|
||||||
if (isUserAllowToEnableNotifications) {
|
if (isUserAllowToEnableNotifications) {
|
||||||
|
|
|
||||||
|
|
@ -341,7 +341,6 @@ include(":domain:blockaid")
|
||||||
include(":domain:blockaid:models")
|
include(":domain:blockaid:models")
|
||||||
include(":domain:notifications")
|
include(":domain:notifications")
|
||||||
include(":domain:notifications:models")
|
include(":domain:notifications:models")
|
||||||
include(":domain:notifications:toggles")
|
|
||||||
include(":domain:express")
|
include(":domain:express")
|
||||||
include(":domain:express:models")
|
include(":domain:express:models")
|
||||||
include(":domain:swap")
|
include(":domain:swap")
|
||||||
|
|
|
||||||
Loading…
Add table
Add a link
Reference in a new issue