Updated on 2026-08-14
This commit is contained in:
commit
749260cdef
31 changed files with 1419 additions and 365 deletions
|
|
@ -1,7 +1,7 @@
|
|||
package com.tangem.tap.common.analytics.appsflyer
|
||||
|
||||
import com.appsflyer.deeplink.DeepLink
|
||||
import com.tangem.datasource.local.appsflyer.AppsFlyerConversionStore
|
||||
import com.tangem.datasource.local.appsflyer.AppsFlyerStore
|
||||
import com.tangem.domain.wallets.models.AppsFlyerConversionData
|
||||
import com.tangem.utils.coroutines.CoroutineDispatcherProvider
|
||||
import kotlinx.coroutines.CoroutineScope
|
||||
|
|
@ -17,7 +17,7 @@ import kotlin.contracts.contract
|
|||
|
||||
@Singleton
|
||||
class AppsFlyerReferralParamsHandler @Inject constructor(
|
||||
private val appsFlyerConversionStore: AppsFlyerConversionStore,
|
||||
private val appsFlyerStore: AppsFlyerStore,
|
||||
dispatchers: CoroutineDispatcherProvider,
|
||||
) {
|
||||
|
||||
|
|
@ -69,7 +69,7 @@ class AppsFlyerReferralParamsHandler @Inject constructor(
|
|||
private fun storeConversionData(refcode: String, campaign: String?) {
|
||||
coroutineScope.launch {
|
||||
mutex.withLock {
|
||||
appsFlyerConversionStore.storeIfAbsent(
|
||||
appsFlyerStore.storeIfAbsent(
|
||||
value = AppsFlyerConversionData(refcode = refcode, campaign = campaign),
|
||||
)
|
||||
}
|
||||
|
|
|
|||
|
|
@ -5,13 +5,18 @@ import com.appsflyer.AppsFlyerLib
|
|||
import com.appsflyer.attribution.AppsFlyerRequestListener
|
||||
import com.tangem.core.analytics.api.EventLogger
|
||||
import com.tangem.core.analytics.api.UserIdHolder
|
||||
import com.tangem.datasource.local.appsflyer.AppsFlyerStore
|
||||
import com.tangem.tap.common.analytics.appsflyer.AppsFlyerDeepLinkListener
|
||||
import com.tangem.tap.common.analytics.appsflyer.TangemAFConversionListener
|
||||
import com.tangem.tap.common.analytics.handlers.firebase.UnderscoreAnalyticsEventConverter
|
||||
import com.tangem.utils.coroutines.CoroutineDispatcherProvider
|
||||
import dagger.assisted.Assisted
|
||||
import dagger.assisted.AssistedFactory
|
||||
import dagger.assisted.AssistedInject
|
||||
import dagger.hilt.android.qualifiers.ApplicationContext
|
||||
import kotlinx.coroutines.CoroutineScope
|
||||
import kotlinx.coroutines.SupervisorJob
|
||||
import kotlinx.coroutines.launch
|
||||
import timber.log.Timber
|
||||
|
||||
interface AppsFlyerAnalyticsClient : EventLogger, UserIdHolder
|
||||
|
|
@ -21,11 +26,15 @@ class AppsFlyerClient @AssistedInject constructor(
|
|||
@ApplicationContext private val context: Context,
|
||||
appsFlyerDeepLinkListener: AppsFlyerDeepLinkListener,
|
||||
tangemAFConversionListener: TangemAFConversionListener,
|
||||
dispatchers: CoroutineDispatcherProvider,
|
||||
private val appsFlyerStore: AppsFlyerStore,
|
||||
) : AppsFlyerAnalyticsClient {
|
||||
|
||||
private val appsFlyerLib: AppsFlyerLib = AppsFlyerLib.getInstance()
|
||||
private val eventConverter = UnderscoreAnalyticsEventConverter()
|
||||
|
||||
private val coroutineScope = CoroutineScope(SupervisorJob() + dispatchers.default)
|
||||
|
||||
init {
|
||||
with(appsFlyerLib) {
|
||||
setAppId(context.packageName)
|
||||
|
|
@ -38,6 +47,8 @@ class AppsFlyerClient @AssistedInject constructor(
|
|||
Timber.i("Starting AppsFlyer SDK")
|
||||
start(context, apiKey, InitializationListener)
|
||||
Timber.i("AppsFlyer SDK started")
|
||||
|
||||
saveUID()
|
||||
}
|
||||
}
|
||||
|
||||
|
|
@ -59,6 +70,16 @@ class AppsFlyerClient @AssistedInject constructor(
|
|||
)
|
||||
}
|
||||
|
||||
private fun saveUID() {
|
||||
coroutineScope.launch {
|
||||
val appsFlyerUID = appsFlyerLib.getAppsFlyerUID(context)
|
||||
|
||||
if (appsFlyerUID != null) {
|
||||
appsFlyerStore.storeUIDIfAbsent(appsFlyerUID)
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
private object InitializationListener : AppsFlyerRequestListener {
|
||||
override fun onSuccess() {
|
||||
Timber.d("AppsFlyer initialized successfully")
|
||||
|
|
|
|||
|
|
@ -1,7 +1,7 @@
|
|||
package com.tangem.tap.common.analytics.appsflyer
|
||||
|
||||
import com.appsflyer.deeplink.DeepLink
|
||||
import com.tangem.datasource.local.appsflyer.AppsFlyerConversionStore
|
||||
import com.tangem.datasource.local.appsflyer.AppsFlyerStore
|
||||
import com.tangem.domain.wallets.models.AppsFlyerConversionData
|
||||
import com.tangem.test.core.ProvideTestModels
|
||||
import com.tangem.utils.coroutines.TestingCoroutineDispatcherProvider
|
||||
|
|
@ -21,15 +21,15 @@ import org.junit.jupiter.params.ParameterizedTest
|
|||
@TestInstance(TestInstance.Lifecycle.PER_CLASS)
|
||||
class AppsFlyerReferralParamsHandlerTest {
|
||||
|
||||
private val appsFlyerConversionStore: AppsFlyerConversionStore = mockk(relaxUnitFun = true)
|
||||
private val appsFlyerStore: AppsFlyerStore = mockk(relaxUnitFun = true)
|
||||
private val handler = AppsFlyerReferralParamsHandler(
|
||||
appsFlyerConversionStore = appsFlyerConversionStore,
|
||||
appsFlyerStore = appsFlyerStore,
|
||||
dispatchers = TestingCoroutineDispatcherProvider(),
|
||||
)
|
||||
|
||||
@AfterEach
|
||||
fun tearDown() {
|
||||
clearMocks(appsFlyerConversionStore)
|
||||
clearMocks(appsFlyerStore)
|
||||
}
|
||||
|
||||
@Nested
|
||||
|
|
@ -43,9 +43,9 @@ class AppsFlyerReferralParamsHandlerTest {
|
|||
|
||||
if (model.shouldStore) {
|
||||
val value = AppsFlyerConversionData(refcode = SUCCESS_REFCODE, campaign = SUCCESS_CAMPAIGN)
|
||||
coVerify { appsFlyerConversionStore.storeIfAbsent(value = value) }
|
||||
coVerify { appsFlyerStore.storeIfAbsent(value = value) }
|
||||
} else {
|
||||
coVerify(inverse = true) { appsFlyerConversionStore.storeIfAbsent(value = any()) }
|
||||
coVerify(inverse = true) { appsFlyerStore.storeIfAbsent(value = any()) }
|
||||
}
|
||||
}
|
||||
|
||||
|
|
@ -112,9 +112,9 @@ class AppsFlyerReferralParamsHandlerTest {
|
|||
|
||||
if (model.shouldStore) {
|
||||
val value = AppsFlyerConversionData(refcode = SUCCESS_REFCODE, campaign = SUCCESS_CAMPAIGN)
|
||||
coVerify { appsFlyerConversionStore.storeIfAbsent(value = value) }
|
||||
coVerify { appsFlyerStore.storeIfAbsent(value = value) }
|
||||
} else {
|
||||
coVerify(inverse = true) { appsFlyerConversionStore.storeIfAbsent(value = any()) }
|
||||
coVerify(inverse = true) { appsFlyerStore.storeIfAbsent(value = any()) }
|
||||
}
|
||||
}
|
||||
|
||||
|
|
|
|||
|
|
@ -12,4 +12,5 @@ data class NotificationApplicationCreateBody(
|
|||
@Json(name = "version") val version: String? = null,
|
||||
@Json(name = "language") val language: String? = null,
|
||||
@Json(name = "timezone") val timezone: String? = null,
|
||||
@Json(name = "appsflyerId") val appsflyerId: String? = null,
|
||||
)
|
||||
|
|
@ -1,7 +1,7 @@
|
|||
package com.tangem.datasource.di
|
||||
|
||||
import com.tangem.datasource.local.appsflyer.AppsFlyerConversionStore
|
||||
import com.tangem.datasource.local.appsflyer.DefaultAppsFlyerConversionStore
|
||||
import com.tangem.datasource.local.appsflyer.AppsFlyerStore
|
||||
import com.tangem.datasource.local.appsflyer.DefaultAppsFlyerStore
|
||||
import com.tangem.datasource.local.preferences.AppPreferencesStore
|
||||
import dagger.Module
|
||||
import dagger.Provides
|
||||
|
|
@ -15,7 +15,7 @@ internal object AppsFlyerConversionStoreModule {
|
|||
|
||||
@Provides
|
||||
@Singleton
|
||||
fun provideAppFlyerConversionStore(appPreferencesStore: AppPreferencesStore): AppsFlyerConversionStore {
|
||||
return DefaultAppsFlyerConversionStore(appPreferencesStore = appPreferencesStore)
|
||||
fun provideAppFlyerStore(appPreferencesStore: AppPreferencesStore): AppsFlyerStore {
|
||||
return DefaultAppsFlyerStore(appPreferencesStore = appPreferencesStore)
|
||||
}
|
||||
}
|
||||
|
|
@ -2,11 +2,15 @@ package com.tangem.datasource.local.appsflyer
|
|||
|
||||
import com.tangem.domain.wallets.models.AppsFlyerConversionData
|
||||
|
||||
interface AppsFlyerConversionStore {
|
||||
interface AppsFlyerStore {
|
||||
|
||||
suspend fun get(): AppsFlyerConversionData?
|
||||
|
||||
suspend fun getUID(): String?
|
||||
|
||||
suspend fun store(value: AppsFlyerConversionData)
|
||||
|
||||
suspend fun storeIfAbsent(value: AppsFlyerConversionData)
|
||||
|
||||
suspend fun storeUIDIfAbsent(value: String)
|
||||
}
|
||||
|
|
@ -5,44 +5,61 @@ import com.squareup.moshi.Json
|
|||
import com.squareup.moshi.JsonClass
|
||||
import com.tangem.datasource.local.preferences.AppPreferencesStore
|
||||
import com.tangem.datasource.local.preferences.utils.getObjectSyncOrNull
|
||||
import com.tangem.datasource.local.preferences.utils.getSyncOrNull
|
||||
import com.tangem.datasource.local.preferences.utils.storeObject
|
||||
import com.tangem.domain.wallets.models.AppsFlyerConversionData
|
||||
import timber.log.Timber
|
||||
|
||||
internal class DefaultAppsFlyerConversionStore(
|
||||
internal class DefaultAppsFlyerStore(
|
||||
private val appPreferencesStore: AppPreferencesStore,
|
||||
) : AppsFlyerConversionStore {
|
||||
) : AppsFlyerStore {
|
||||
|
||||
override suspend fun get(): AppsFlyerConversionData? {
|
||||
val dto = appPreferencesStore.getObjectSyncOrNull<ConversionDataDTO>(KEY) ?: return null
|
||||
val dto = appPreferencesStore.getObjectSyncOrNull<ConversionDataDTO>(CONVERSION_DATA_KEY) ?: return null
|
||||
|
||||
return ConversionDataConverter.convertBack(value = dto).also {
|
||||
Timber.i("Getting conversion data from store: $it")
|
||||
}
|
||||
}
|
||||
|
||||
override suspend fun getUID(): String? = appPreferencesStore.getSyncOrNull(UID_KEY)
|
||||
|
||||
override suspend fun store(value: AppsFlyerConversionData) {
|
||||
Timber.i("Storing conversion data to store: $value")
|
||||
|
||||
val dto = ConversionDataConverter.convert(value)
|
||||
|
||||
appPreferencesStore.storeObject(KEY, dto)
|
||||
appPreferencesStore.storeObject(CONVERSION_DATA_KEY, dto)
|
||||
}
|
||||
|
||||
override suspend fun storeIfAbsent(value: AppsFlyerConversionData) {
|
||||
Timber.i("Storing conversion data to store if absent: $value")
|
||||
appPreferencesStore.editData { preferences ->
|
||||
val saved = preferences[CONVERSION_DATA_KEY]
|
||||
|
||||
val dto = appPreferencesStore.getObjectSyncOrNull<ConversionDataDTO>(KEY)
|
||||
if (saved == null) {
|
||||
Timber.i("Conversion data is absent, storing $value")
|
||||
preferences.setObject(CONVERSION_DATA_KEY, ConversionDataConverter.convert(value))
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
if (dto == null) {
|
||||
Timber.i("Conversion data is absent, storing $value")
|
||||
appPreferencesStore.storeObject(KEY, ConversionDataConverter.convert(value))
|
||||
override suspend fun storeUIDIfAbsent(value: String) {
|
||||
Timber.i("Storing UID to store if absent: $value")
|
||||
appPreferencesStore.editData { preferences ->
|
||||
val saved = preferences[UID_KEY]
|
||||
|
||||
if (saved == null) {
|
||||
Timber.i("UID is absent, storing $value")
|
||||
preferences[UID_KEY] = value
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
private companion object {
|
||||
|
||||
val KEY = stringPreferencesKey("APPS_FLYER_CONVERSION_DATA")
|
||||
val UID_KEY = stringPreferencesKey("APPS_FLYER_UID")
|
||||
val CONVERSION_DATA_KEY = stringPreferencesKey("APPS_FLYER_CONVERSION_DATA")
|
||||
}
|
||||
}
|
||||
|
||||
|
|
@ -123,8 +123,8 @@
|
|||
<string name="auth_info_subtitle">Wähle eine Wallet zum Einloggen</string>
|
||||
<string name="auth_info_title">Willkommen zurück!</string>
|
||||
<plurals name="auth_wallet_hardware_description">
|
||||
<item quantity="one">%s Karte</item>
|
||||
<item quantity="other">%s Karten</item>
|
||||
<item quantity="one">%d Karte</item>
|
||||
<item quantity="other">%d Karten</item>
|
||||
</plurals>
|
||||
<string name="auth_wallet_mobile_description">Mobile-Wallet</string>
|
||||
<string name="backup_complete_description">Du hast Deine Wallet erfolgreich gesichert.</string>
|
||||
|
|
@ -313,8 +313,8 @@
|
|||
<string name="common_network_fee_title">Netzgebühr</string>
|
||||
<string name="common_network_fee_warning_content">Der überwiesene Betrag wird um %1$s (%2$s) gekürzt, um die gewählte Gebührenhöhe zu decken.</string>
|
||||
<plurals name="common_networks_count">
|
||||
<item quantity="one">%1$s Netzwerk</item>
|
||||
<item quantity="other">%1$s Netzwerke</item>
|
||||
<item quantity="one">%d Netzwerk</item>
|
||||
<item quantity="other">%d Netzwerke</item>
|
||||
</plurals>
|
||||
<string name="common_new_address">Neue Adresse</string>
|
||||
<string name="common_news">Nachrichten</string>
|
||||
|
|
@ -1047,6 +1047,7 @@
|
|||
<string name="onramp_transaction_status_footer_text">Du kannst diesen Bildschirm schließen und den Transaktionsstatus auf dem Bildschirm mit den Token-Details überprüfen.</string>
|
||||
<string name="onramp_up_to_rate">Bis zu</string>
|
||||
<string name="onramp_via">Über</string>
|
||||
<string name="onramp_via_provider">über %s</string>
|
||||
<string name="onramp_you_will_pay_title">Du zahlst</string>
|
||||
<string name="organize_tokens_group">Gruppe erstellen</string>
|
||||
<string name="organize_tokens_sort_by_balance">Nach Guthaben</string>
|
||||
|
|
|
|||
|
|
@ -174,8 +174,8 @@
|
|||
<item quantity="other">%d tarjetas</item>
|
||||
</plurals>
|
||||
<plurals name="card_label_token_count">
|
||||
<item quantity="one">%s token</item>
|
||||
<item quantity="other">%s tokens</item>
|
||||
<item quantity="one">%d token</item>
|
||||
<item quantity="other">%d tokens</item>
|
||||
</plurals>
|
||||
<string name="card_reset_alert_continue_message">Por favor restablezca el siguiente dispositivo para continuar.</string>
|
||||
<string name="card_reset_alert_continue_title">Restablecer billetera</string>
|
||||
|
|
@ -1043,6 +1043,7 @@
|
|||
<string name="onramp_transaction_status_footer_text">Puede comprobar el estado de la transacción desde la página detallada del token</string>
|
||||
<string name="onramp_up_to_rate">Hasta</string>
|
||||
<string name="onramp_via">Vía</string>
|
||||
<string name="onramp_via_provider">vía %s</string>
|
||||
<string name="onramp_you_will_pay_title">Pagará</string>
|
||||
<string name="organize_tokens_group">Agrupar</string>
|
||||
<string name="organize_tokens_sort_by_balance">Por saldo</string>
|
||||
|
|
|
|||
|
|
@ -173,8 +173,8 @@
|
|||
<item quantity="other">%d cartes</item>
|
||||
</plurals>
|
||||
<plurals name="card_label_token_count">
|
||||
<item quantity="one">%s token</item>
|
||||
<item quantity="other">%s tokens</item>
|
||||
<item quantity="one">%d token</item>
|
||||
<item quantity="other">%d tokens</item>
|
||||
</plurals>
|
||||
<string name="card_reset_alert_continue_message">Veuillez réinitialiser l\'appareil suivant pour continuer.</string>
|
||||
<string name="card_reset_alert_continue_title">Réinitialisation du portefeuille</string>
|
||||
|
|
@ -1039,6 +1039,7 @@
|
|||
<string name="onramp_transaction_status_footer_text">Vous pouvez vérifier l\'état de la transaction à partir de la page du jeton</string>
|
||||
<string name="onramp_up_to_rate">Jusqu\'à</string>
|
||||
<string name="onramp_via">Via</string>
|
||||
<string name="onramp_via_provider">via %s</string>
|
||||
<string name="onramp_you_will_pay_title">Vous paierez</string>
|
||||
<string name="organize_tokens_group">Grouper</string>
|
||||
<string name="organize_tokens_sort_by_balance">Par solde</string>
|
||||
|
|
|
|||
|
|
@ -172,7 +172,7 @@
|
|||
<item quantity="other">%d デバイス</item>
|
||||
</plurals>
|
||||
<plurals name="card_label_token_count">
|
||||
<item quantity="other">%1$dトークン</item>
|
||||
<item quantity="other">%dトークン</item>
|
||||
</plurals>
|
||||
<string name="card_reset_alert_continue_message">続行するには次のデバイスをリセットしてください。</string>
|
||||
<string name="card_reset_alert_continue_title">ウォレットのリセット</string>
|
||||
|
|
@ -1031,6 +1031,7 @@
|
|||
<string name="onramp_transaction_status_footer_text">この画面を閉じて、トークンの詳細画面で取引状況を確認できます。</string>
|
||||
<string name="onramp_up_to_rate">最大</string>
|
||||
<string name="onramp_via">経由</string>
|
||||
<string name="onramp_via_provider">%s 経由</string>
|
||||
<string name="onramp_you_will_pay_title">支払い</string>
|
||||
<string name="organize_tokens_group">グループ</string>
|
||||
<string name="organize_tokens_sort_by_balance">残高順</string>
|
||||
|
|
|
|||
|
|
@ -109,7 +109,7 @@
|
|||
<string name="app_settings_off_saved_wallet_alert_message">При отключении функции сохранения кошелька все ранее сохраненные кошельки будут удалены из приложения.</string>
|
||||
<string name="app_settings_on_require_access_code_alert_message">Это удалит все сохранённые коды доступа к кошелькам. Любое дальнейшее взаимодействие с кошельком будет требовать ввода кода доступа.</string>
|
||||
<string name="app_settings_require_access_code">Требуется код доступа</string>
|
||||
<string name="app_settings_require_access_code_footer">Эта опция отключает использование биометрии для выполнения чувствительных действий. Каждый раз, например при подписании транзакции, вам потребуется вводить код доступа.</string>
|
||||
<string name="app_settings_require_access_code_footer">Эта опция отключает использование биометрии для выполнения чувствительных действий. Каждый раз, например, при подписании транзакции, вам потребуется вводить код доступа.</string>
|
||||
<string name="app_settings_saved_access_codes">Сохранение кода доступа</string>
|
||||
<string name="app_settings_saved_access_codes_footer">Подключите функцию хранения кодов доступа от карт на телефоне в зашифрованном виде, и при работе с картой или кольцом вместо кода доступа будет запрашиваться биометрическая аутентификация.</string>
|
||||
<string name="app_settings_saved_wallet">Cохранение кошелька</string>
|
||||
|
|
@ -737,7 +737,7 @@
|
|||
<string name="markets_loading_no_data_title">Нет данных</string>
|
||||
<string name="markets_pulse_common_title">Пульс рынка</string>
|
||||
<string name="markets_quick_actions">Быстрые действия</string>
|
||||
<string name="markets_search_header_title">Поиск на рынке</string>
|
||||
<string name="markets_search_header_title">Поиск токенов</string>
|
||||
<string name="markets_search_result_title">Результат</string>
|
||||
<string name="markets_search_see_tokens_under_100k">Токены с капитализацией меньше 100к USD</string>
|
||||
<string name="markets_search_show_tokens">Показать токены</string>
|
||||
|
|
@ -1079,6 +1079,7 @@
|
|||
<string name="onramp_transaction_status_footer_text">Вы можете закрыть этот экран и проверить статус транзакции на экране информации о токене.</string>
|
||||
<string name="onramp_up_to_rate">До</string>
|
||||
<string name="onramp_via">Через</string>
|
||||
<string name="onramp_via_provider">через %s</string>
|
||||
<string name="onramp_you_will_pay_title">Вы заплатите</string>
|
||||
<string name="organize_tokens_group">Группы</string>
|
||||
<string name="organize_tokens_sort_by_balance">По балансу</string>
|
||||
|
|
|
|||
|
|
@ -122,10 +122,10 @@
|
|||
<string name="auth_info_subtitle">Виберіть гаманець для входу</string>
|
||||
<string name="auth_info_title">З поверненням!</string>
|
||||
<plurals name="auth_wallet_hardware_description">
|
||||
<item quantity="one">%s картка</item>
|
||||
<item quantity="few">%s картки</item>
|
||||
<item quantity="many">%s карток</item>
|
||||
<item quantity="other">%s картки</item>
|
||||
<item quantity="one">%d картка</item>
|
||||
<item quantity="few">%d картки</item>
|
||||
<item quantity="many">%d карток</item>
|
||||
<item quantity="other">%d картки</item>
|
||||
</plurals>
|
||||
<string name="auth_wallet_mobile_description">Мобільний гаманець</string>
|
||||
<string name="backup_complete_description">Ви успішно створили резервну копію свого гаманця.</string>
|
||||
|
|
@ -177,10 +177,10 @@
|
|||
<item quantity="other">%d пристроїв</item>
|
||||
</plurals>
|
||||
<plurals name="card_label_token_count">
|
||||
<item quantity="one">%1$d токен</item>
|
||||
<item quantity="few">%1$d токени</item>
|
||||
<item quantity="many">%1$d токенів</item>
|
||||
<item quantity="other">%1$d токени</item>
|
||||
<item quantity="one">%d токен</item>
|
||||
<item quantity="few">%d токени</item>
|
||||
<item quantity="many">%d токенів</item>
|
||||
<item quantity="other">%d токени</item>
|
||||
</plurals>
|
||||
<string name="card_reset_alert_continue_message">Будь ласка, скиньте налаштування наступного пристрою, щоб продовжити.</string>
|
||||
<string name="card_reset_alert_continue_title">Скидання гаманця</string>
|
||||
|
|
@ -322,10 +322,10 @@
|
|||
<string name="common_network_fee_title">Комісія мережі</string>
|
||||
<string name="common_network_fee_warning_content">Сума відправлення буде зменшена на %1$s (%2$s) для покриття обраного рівня комісії</string>
|
||||
<plurals name="common_networks_count">
|
||||
<item quantity="one">%1$s мережа</item>
|
||||
<item quantity="few">%1$s мережі</item>
|
||||
<item quantity="many">%1$s мереж</item>
|
||||
<item quantity="other">%1$s мережі</item>
|
||||
<item quantity="one">%d мережа</item>
|
||||
<item quantity="few">%d мережі</item>
|
||||
<item quantity="many">%d мереж</item>
|
||||
<item quantity="other">%d мережі</item>
|
||||
</plurals>
|
||||
<string name="common_new_address">Нова адреса</string>
|
||||
<string name="common_news">Новини</string>
|
||||
|
|
@ -824,16 +824,16 @@
|
|||
<string name="mobile_wallet_requires_min_os_warning_title">Мобільний гаманець потребує %1$s або новіше.</string>
|
||||
<string name="news_all_news">Всі новини</string>
|
||||
<plurals name="news_published_hours_ago">
|
||||
<item quantity="one">%1$s годину тому</item>
|
||||
<item quantity="few">%1$s години тому</item>
|
||||
<item quantity="many">%1$s годин тому</item>
|
||||
<item quantity="other">%1$s годин тому</item>
|
||||
<item quantity="one">%d годину тому</item>
|
||||
<item quantity="few">%d години тому</item>
|
||||
<item quantity="many">%d годин тому</item>
|
||||
<item quantity="other">%d годин тому</item>
|
||||
</plurals>
|
||||
<plurals name="news_published_minutes_ago">
|
||||
<item quantity="one">%1$s хвилину тому</item>
|
||||
<item quantity="few">%1$s хвилини тому</item>
|
||||
<item quantity="many">%1$s хвилин тому</item>
|
||||
<item quantity="other">%1$s хвилин тому</item>
|
||||
<item quantity="one">%d хвилину тому</item>
|
||||
<item quantity="few">%d хвилини тому</item>
|
||||
<item quantity="many">%d хвилин тому</item>
|
||||
<item quantity="other">%d хвилин тому</item>
|
||||
</plurals>
|
||||
<string name="news_related_tokens">Пов\'язані токени</string>
|
||||
<string name="news_stay_in_the_loop">Залишайтеся в курсі подій</string>
|
||||
|
|
@ -1033,10 +1033,10 @@
|
|||
<string name="onramp_provider_max_amount">Доступно до %s</string>
|
||||
<string name="onramp_provider_min_amount">Доступно від %s</string>
|
||||
<plurals name="onramp_providers_count">
|
||||
<item quantity="one">%s провайдер</item>
|
||||
<item quantity="few">%s провайдери</item>
|
||||
<item quantity="many">%s провайдерів</item>
|
||||
<item quantity="other">%s провайдерів</item>
|
||||
<item quantity="one">%d провайдер</item>
|
||||
<item quantity="few">%d провайдери</item>
|
||||
<item quantity="many">%d провайдерів</item>
|
||||
<item quantity="other">%d провайдерів</item>
|
||||
</plurals>
|
||||
<string name="onramp_providers_subtitle">Провайдери</string>
|
||||
<string name="onramp_recently_used_title">Нещодавно використано</string>
|
||||
|
|
@ -1050,10 +1050,10 @@
|
|||
<string name="onramp_settings_title">Параметри</string>
|
||||
<string name="onramp_statuses_view_footer">Ви можете закрити цей екран і перевірити статус транзакції на екрані деталей токена.</string>
|
||||
<plurals name="onramp_timing_days">
|
||||
<item quantity="one">до %s дня</item>
|
||||
<item quantity="few">до %s днів</item>
|
||||
<item quantity="many">до %s днів</item>
|
||||
<item quantity="other">до %s днів</item>
|
||||
<item quantity="one">до %d дня</item>
|
||||
<item quantity="few">до %d днів</item>
|
||||
<item quantity="many">до %d днів</item>
|
||||
<item quantity="other">до %d днів</item>
|
||||
</plurals>
|
||||
<string name="onramp_timing_minutes">%s хв</string>
|
||||
<string name="onramp_title_available_from">Доступно з</string>
|
||||
|
|
@ -1063,6 +1063,7 @@
|
|||
<string name="onramp_transaction_status_footer_text">Ви можете перевірити статус транзакції на сторінці токена</string>
|
||||
<string name="onramp_up_to_rate">До</string>
|
||||
<string name="onramp_via">Через</string>
|
||||
<string name="onramp_via_provider">через %s</string>
|
||||
<string name="onramp_you_will_pay_title">Ви заплатите</string>
|
||||
<string name="organize_tokens_group">Групами</string>
|
||||
<string name="organize_tokens_sort_by_balance">За балансом</string>
|
||||
|
|
@ -1664,10 +1665,10 @@
|
|||
<string name="user_wallet_list_unlock_all">Розблокувати все</string>
|
||||
<string name="user_wallet_list_unlock_all_with">Розблокувати все з %s</string>
|
||||
<plurals name="visa_limits_available_for_days_title">
|
||||
<item quantity="one">доступно протягом %1$s дня</item>
|
||||
<item quantity="few">доступно протягом %1$s днів</item>
|
||||
<item quantity="many">доступно протягом %1$s днів</item>
|
||||
<item quantity="other">доступно протягом %1$s днів</item>
|
||||
<item quantity="one">доступно протягом %d дня</item>
|
||||
<item quantity="few">доступно протягом %d днів</item>
|
||||
<item quantity="many">доступно протягом %d днів</item>
|
||||
<item quantity="other">доступно протягом %d днів</item>
|
||||
</plurals>
|
||||
<string name="visa_main_balances_and_limits">Баланси та ліміти</string>
|
||||
<string name="visa_onboarding_access_code_navigation_title">Код доступу</string>
|
||||
|
|
|
|||
|
|
@ -299,6 +299,7 @@
|
|||
<string name="common_go_to_token">Go to token</string>
|
||||
<string name="common_got_it">Got it</string>
|
||||
<string name="common_hide">Hide</string>
|
||||
<string name="common_hold_to">Hold to %s</string>
|
||||
<string name="common_hour">hour</string>
|
||||
<string name="common_import">Import</string>
|
||||
<string name="common_in_progress">In progress</string>
|
||||
|
|
@ -374,6 +375,7 @@
|
|||
<string name="common_swap">Swap</string>
|
||||
<string name="common_tangem">Tangem</string>
|
||||
<string name="common_tangem_wallet">Tangem Wallet</string>
|
||||
<string name="common_tap_and_hold_hint">Tap and hold</string>
|
||||
<string name="common_terms_and_conditions">terms and conditions</string>
|
||||
<string name="common_terms_of_use">Terms of Use</string>
|
||||
<string name="common_to">To</string>
|
||||
|
|
@ -528,7 +530,7 @@
|
|||
<string name="express_provider">Provider</string>
|
||||
<string name="express_provider_best_rate">Best rate</string>
|
||||
<string name="express_provider_fca_warning_list">FCA Warning List</string>
|
||||
<string name="express_provider_great_rate">Best choice</string>
|
||||
<string name="express_provider_great_rate">Competitive rate</string>
|
||||
<string name="express_provider_in_fca_warning_list">Provider in FCA warning list</string>
|
||||
<string name="express_provider_max_amount">Available up to %s</string>
|
||||
<string name="express_provider_min_amount">Available from %s</string>
|
||||
|
|
@ -730,7 +732,7 @@
|
|||
<string name="markets_loading_no_data_title">No data</string>
|
||||
<string name="markets_pulse_common_title">Market Pulse</string>
|
||||
<string name="markets_quick_actions">Quick actions</string>
|
||||
<string name="markets_search_header_title">Search through the market</string>
|
||||
<string name="markets_search_header_title">Search tokens</string>
|
||||
<string name="markets_search_result_title">Result</string>
|
||||
<string name="markets_search_see_tokens_under_100k">See tokens under 100k USD market cap</string>
|
||||
<string name="markets_search_show_tokens">Show tokens</string>
|
||||
|
|
@ -745,10 +747,10 @@
|
|||
<string name="markets_selector_interval_7d_title">7d</string>
|
||||
<string name="markets_selector_interval_all_title">All</string>
|
||||
<string name="markets_sort_by_experienced_buyers_title">Experienced buyers</string>
|
||||
<string name="markets_sort_by_rating_title">Capitalization</string>
|
||||
<string name="markets_sort_by_rating_title">Market Cap</string>
|
||||
<string name="markets_sort_by_title">Sort By</string>
|
||||
<string name="markets_sort_by_top_gainers_title">Top Gainers</string>
|
||||
<string name="markets_sort_by_top_losers_title">Top Losers</string>
|
||||
<string name="markets_sort_by_top_gainers_title">Gainers</string>
|
||||
<string name="markets_sort_by_top_losers_title">Losers</string>
|
||||
<string name="markets_sort_by_trending_title">Trending</string>
|
||||
<string name="markets_sort_by_yield_mode_title">Yield Mode</string>
|
||||
<string name="markets_staking_banner_description_placeholder">Staking is the easiest way to receive rewards on your crypto. %s</string>
|
||||
|
|
@ -778,7 +780,7 @@
|
|||
<string name="markets_token_details_exchanges_title">Exchanges</string>
|
||||
<string name="markets_token_details_experienced_buyers">Experienced buyers</string>
|
||||
<string name="markets_token_details_experienced_buyers_description">Net buyers with the additional requirement of having at least 100 outgoing transactions</string>
|
||||
<string name="markets_token_details_experienced_buyers_full">Experienced buyers</string>
|
||||
<string name="markets_token_details_experienced_buyers_full">Active Buyers</string>
|
||||
<string name="markets_token_details_fully_diluted_valuation">Fully diluted valuation</string>
|
||||
<string name="markets_token_details_fully_diluted_valuation_description">The total theoretical value of a cryptocurrency if all coins that could exist are in circulation, including those not currently circulating</string>
|
||||
<string name="markets_token_details_fully_diluted_valuation_full">Fully diluted valuation</string>
|
||||
|
|
@ -1022,7 +1024,7 @@
|
|||
<string name="onramp_max_amount_restriction">The purchase amount should be no more than %s</string>
|
||||
<string name="onramp_min_amount_restriction">The amount to buy must be at least %s</string>
|
||||
<string name="onramp_no_available_providers">No available providers for this currency</string>
|
||||
<string name="onramp_offer_type_fastet">Fastest</string>
|
||||
<string name="onramp_offer_type_fastet">Quickest Processing</string>
|
||||
<string name="onramp_pay_with">Pay with</string>
|
||||
<string name="onramp_payment_method_subtitle">Payment method</string>
|
||||
<string name="onramp_provider_max_amount">Available up to %s</string>
|
||||
|
|
@ -1054,6 +1056,7 @@
|
|||
<string name="onramp_transaction_status_footer_text">You can close this screen and check the transaction status on the token details screen.</string>
|
||||
<string name="onramp_up_to_rate">Up to</string>
|
||||
<string name="onramp_via">Via</string>
|
||||
<string name="onramp_via_provider">via %s</string>
|
||||
<string name="onramp_you_will_pay_title">You will pay</string>
|
||||
<string name="organize_tokens_group">Group</string>
|
||||
<string name="organize_tokens_sort_by_balance">By balance</string>
|
||||
|
|
@ -1609,7 +1612,7 @@
|
|||
<string name="token_swap_changelly_promotion_message">Exchange this token for another at %1$s service fees from February %2$s-%3$s.</string>
|
||||
<string name="token_swap_changelly_promotion_title">Swap with Changelly, %s fees</string>
|
||||
<string name="token_swap_promotion_button">Swap now</string>
|
||||
<string name="tokens_list_hot_crypto_header">Hot crypto 🔥</string>
|
||||
<string name="tokens_list_hot_crypto_header">Market Trend 🔥</string>
|
||||
<string name="tokens_list_unavailable_to_purchase_header">Unavailable to purchase</string>
|
||||
<string name="tokens_list_unavailable_to_sell_header">Unavailable to sell</string>
|
||||
<string name="tokens_list_unavailable_to_swap_header">Unavailable for swap from %s</string>
|
||||
|
|
|
|||
|
|
@ -9,7 +9,7 @@ import com.tangem.datasource.api.common.response.isNetworkError
|
|||
import com.tangem.datasource.api.tangemTech.TangemTechApi
|
||||
import com.tangem.datasource.api.tangemTech.models.UserTokensResponse
|
||||
import com.tangem.datasource.api.tangemTech.models.WalletType
|
||||
import com.tangem.datasource.local.appsflyer.AppsFlyerConversionStore
|
||||
import com.tangem.datasource.local.appsflyer.AppsFlyerStore
|
||||
import com.tangem.datasource.local.token.UserTokensResponseStore
|
||||
import com.tangem.datasource.local.userwallet.UserWalletsStore
|
||||
import com.tangem.domain.account.featuretoggle.AccountsFeatureToggles
|
||||
|
|
@ -29,7 +29,7 @@ class UserTokensSaver(
|
|||
private val dispatchers: CoroutineDispatcherProvider,
|
||||
private val addressesEnricher: UserTokensResponseAddressesEnricher,
|
||||
private val walletServerBinder: WalletServerBinder,
|
||||
private val appsFlyerConversionStore: AppsFlyerConversionStore,
|
||||
private val appsFlyerStore: AppsFlyerStore,
|
||||
private val accountsFeatureToggles: AccountsFeatureToggles,
|
||||
private val pushTokensRetryerPool: RetryerPool,
|
||||
) {
|
||||
|
|
@ -72,7 +72,7 @@ class UserTokensSaver(
|
|||
|
||||
pushNew(userWallet = userWallet, response = enrichedResponse, onFailSend = onFailSend)
|
||||
} else {
|
||||
val conversionData = appsFlyerConversionStore.get()
|
||||
val conversionData = appsFlyerStore.get()
|
||||
|
||||
val enrichedResponse = response.enrichIf(userWalletId = userWalletId, condition = useEnricher).copy(
|
||||
walletName = userWallet.name.takeIf { it.isNotBlank() },
|
||||
|
|
|
|||
|
|
@ -10,7 +10,7 @@ import com.tangem.data.common.quote.QuotesFetcher
|
|||
import com.tangem.data.common.wallet.DefaultWalletServerBinder
|
||||
import com.tangem.data.common.wallet.WalletServerBinder
|
||||
import com.tangem.datasource.api.tangemTech.TangemTechApi
|
||||
import com.tangem.datasource.local.appsflyer.AppsFlyerConversionStore
|
||||
import com.tangem.datasource.local.appsflyer.AppsFlyerStore
|
||||
import com.tangem.datasource.local.preferences.AppPreferencesStore
|
||||
import com.tangem.datasource.local.token.UserTokensResponseStore
|
||||
import com.tangem.datasource.local.userwallet.UserWalletsStore
|
||||
|
|
@ -76,7 +76,7 @@ internal object DataCommonModule {
|
|||
dispatchers: CoroutineDispatcherProvider,
|
||||
addressesEnricher: UserTokensResponseAddressesEnricher,
|
||||
walletServerBinder: WalletServerBinder,
|
||||
appsFlyerConversionStore: AppsFlyerConversionStore,
|
||||
appsFlyerStore: AppsFlyerStore,
|
||||
accountsFeatureToggles: AccountsFeatureToggles,
|
||||
): UserTokensSaver {
|
||||
return UserTokensSaver(
|
||||
|
|
@ -90,7 +90,7 @@ internal object DataCommonModule {
|
|||
coroutineScope = CoroutineScope(SupervisorJob() + dispatchers.default),
|
||||
),
|
||||
walletServerBinder = walletServerBinder,
|
||||
appsFlyerConversionStore = appsFlyerConversionStore,
|
||||
appsFlyerStore = appsFlyerStore,
|
||||
)
|
||||
}
|
||||
|
||||
|
|
@ -110,13 +110,13 @@ internal object DataCommonModule {
|
|||
@Singleton
|
||||
fun provideWalletServerBinder(
|
||||
userWalletsStore: UserWalletsStore,
|
||||
appsFlyerConversionStore: AppsFlyerConversionStore,
|
||||
appsFlyerStore: AppsFlyerStore,
|
||||
tangemTechApi: TangemTechApi,
|
||||
dispatchers: CoroutineDispatcherProvider,
|
||||
): WalletServerBinder {
|
||||
return DefaultWalletServerBinder(
|
||||
userWalletsStore = userWalletsStore,
|
||||
appsFlyerConversionStore = appsFlyerConversionStore,
|
||||
appsFlyerStore = appsFlyerStore,
|
||||
tangemTechApi = tangemTechApi,
|
||||
dispatchers = dispatchers,
|
||||
)
|
||||
|
|
|
|||
|
|
@ -3,7 +3,7 @@ package com.tangem.data.common.wallet
|
|||
import com.tangem.datasource.api.common.response.ApiResponse
|
||||
import com.tangem.datasource.api.tangemTech.TangemTechApi
|
||||
import com.tangem.datasource.api.tangemTech.converters.WalletIdBodyConverter
|
||||
import com.tangem.datasource.local.appsflyer.AppsFlyerConversionStore
|
||||
import com.tangem.datasource.local.appsflyer.AppsFlyerStore
|
||||
import com.tangem.datasource.local.userwallet.UserWalletsStore
|
||||
import com.tangem.domain.models.wallet.UserWallet
|
||||
import com.tangem.domain.models.wallet.UserWalletId
|
||||
|
|
@ -12,7 +12,7 @@ import kotlinx.coroutines.withContext
|
|||
|
||||
internal class DefaultWalletServerBinder(
|
||||
private val userWalletsStore: UserWalletsStore,
|
||||
private val appsFlyerConversionStore: AppsFlyerConversionStore,
|
||||
private val appsFlyerStore: AppsFlyerStore,
|
||||
private val tangemTechApi: TangemTechApi,
|
||||
private val dispatchers: CoroutineDispatcherProvider,
|
||||
) : WalletServerBinder {
|
||||
|
|
@ -24,7 +24,7 @@ internal class DefaultWalletServerBinder(
|
|||
}
|
||||
|
||||
override suspend fun bind(userWallet: UserWallet): ApiResponse<Unit> {
|
||||
val conversionData = appsFlyerConversionStore.get()
|
||||
val conversionData = appsFlyerStore.get()
|
||||
|
||||
return withContext(dispatchers.io) {
|
||||
tangemTechApi.createWallet(
|
||||
|
|
|
|||
|
|
@ -6,7 +6,7 @@ import com.tangem.datasource.api.common.response.ApiResponseError
|
|||
import com.tangem.datasource.api.tangemTech.TangemTechApi
|
||||
import com.tangem.datasource.api.tangemTech.models.UserTokensResponse
|
||||
import com.tangem.datasource.api.tangemTech.models.WalletType
|
||||
import com.tangem.datasource.local.appsflyer.AppsFlyerConversionStore
|
||||
import com.tangem.datasource.local.appsflyer.AppsFlyerStore
|
||||
import com.tangem.datasource.local.token.UserTokensResponseStore
|
||||
import com.tangem.datasource.local.userwallet.UserWalletsStore
|
||||
import com.tangem.domain.account.featuretoggle.AccountsFeatureToggles
|
||||
|
|
@ -30,7 +30,7 @@ class UserTokensSaverTest {
|
|||
every { this@mockk.isFeatureEnabled } returns true
|
||||
}
|
||||
private val walletServerBinder: WalletServerBinder = mockk()
|
||||
private val appsFlyerConversionStore: AppsFlyerConversionStore = mockk()
|
||||
private val appsFlyerStore: AppsFlyerStore = mockk()
|
||||
|
||||
private val userTokensSaver: UserTokensSaver = UserTokensSaver(
|
||||
tangemTechApi = tangemTechApi,
|
||||
|
|
@ -39,7 +39,7 @@ class UserTokensSaverTest {
|
|||
dispatchers = TestingCoroutineDispatcherProvider(),
|
||||
addressesEnricher = enricher,
|
||||
walletServerBinder = walletServerBinder,
|
||||
appsFlyerConversionStore = appsFlyerConversionStore,
|
||||
appsFlyerStore = appsFlyerStore,
|
||||
accountsFeatureToggles = accountsFeatureToggles,
|
||||
pushTokensRetryerPool = mockk(),
|
||||
)
|
||||
|
|
|
|||
|
|
@ -6,7 +6,7 @@ import com.tangem.datasource.api.common.response.ApiResponseError
|
|||
import com.tangem.datasource.api.tangemTech.TangemTechApi
|
||||
import com.tangem.datasource.api.tangemTech.models.WalletIdBody
|
||||
import com.tangem.datasource.api.tangemTech.models.WalletType
|
||||
import com.tangem.datasource.local.appsflyer.AppsFlyerConversionStore
|
||||
import com.tangem.datasource.local.appsflyer.AppsFlyerStore
|
||||
import com.tangem.datasource.local.userwallet.UserWalletsStore
|
||||
import com.tangem.domain.models.wallet.UserWallet
|
||||
import com.tangem.domain.models.wallet.UserWalletId
|
||||
|
|
@ -27,13 +27,13 @@ import org.junit.jupiter.api.TestInstance
|
|||
internal class DefaultWalletServerBinderTest {
|
||||
|
||||
private val userWalletsStore: UserWalletsStore = mockk()
|
||||
private val appsFlyerConversionStore: AppsFlyerConversionStore = mockk()
|
||||
private val appsFlyerStore: AppsFlyerStore = mockk()
|
||||
private val tangemTechApi: TangemTechApi = mockk()
|
||||
private val dispatchers: CoroutineDispatcherProvider = TestingCoroutineDispatcherProvider()
|
||||
|
||||
private val binder = DefaultWalletServerBinder(
|
||||
userWalletsStore = userWalletsStore,
|
||||
appsFlyerConversionStore = appsFlyerConversionStore,
|
||||
appsFlyerStore = appsFlyerStore,
|
||||
tangemTechApi = tangemTechApi,
|
||||
dispatchers = dispatchers
|
||||
)
|
||||
|
|
@ -47,7 +47,7 @@ internal class DefaultWalletServerBinderTest {
|
|||
|
||||
@AfterEach
|
||||
fun tearDown() {
|
||||
clearMocks(userWalletsStore, appsFlyerConversionStore, tangemTechApi)
|
||||
clearMocks(userWalletsStore, appsFlyerStore, tangemTechApi)
|
||||
}
|
||||
|
||||
@Nested
|
||||
|
|
@ -66,7 +66,7 @@ internal class DefaultWalletServerBinderTest {
|
|||
val apiResponse = ApiResponse.Success(Unit)
|
||||
|
||||
coEvery { userWalletsStore.getSyncOrNull(userWalletId) } returns userWallet
|
||||
coEvery { appsFlyerConversionStore.get() } returns conversionData
|
||||
coEvery { appsFlyerStore.get() } returns conversionData
|
||||
coEvery { tangemTechApi.createWallet(requestBody) } returns apiResponse
|
||||
|
||||
val actual = binder.bind(userWalletId = userWalletId)
|
||||
|
|
@ -75,7 +75,7 @@ internal class DefaultWalletServerBinderTest {
|
|||
|
||||
coVerifyOrder {
|
||||
userWalletsStore.getSyncOrNull(userWalletId)
|
||||
appsFlyerConversionStore.get()
|
||||
appsFlyerStore.get()
|
||||
tangemTechApi.createWallet(requestBody)
|
||||
}
|
||||
}
|
||||
|
|
@ -93,7 +93,7 @@ internal class DefaultWalletServerBinderTest {
|
|||
}
|
||||
|
||||
coVerify(inverse = true) {
|
||||
appsFlyerConversionStore.get()
|
||||
appsFlyerStore.get()
|
||||
tangemTechApi.createWallet(any())
|
||||
}
|
||||
}
|
||||
|
|
@ -108,7 +108,7 @@ internal class DefaultWalletServerBinderTest {
|
|||
val apiResponse = ApiResponse.Success(Unit)
|
||||
|
||||
coEvery { userWalletsStore.getSyncOrNull(userWalletId) } returns userWallet
|
||||
coEvery { appsFlyerConversionStore.get() } returns null
|
||||
coEvery { appsFlyerStore.get() } returns null
|
||||
coEvery { tangemTechApi.createWallet(requestBody) } returns apiResponse
|
||||
|
||||
val actual = binder.bind(userWalletId = userWalletId)
|
||||
|
|
@ -117,7 +117,7 @@ internal class DefaultWalletServerBinderTest {
|
|||
|
||||
coVerifyOrder {
|
||||
userWalletsStore.getSyncOrNull(userWalletId)
|
||||
appsFlyerConversionStore.get()
|
||||
appsFlyerStore.get()
|
||||
tangemTechApi.createWallet(requestBody)
|
||||
}
|
||||
}
|
||||
|
|
@ -134,7 +134,7 @@ internal class DefaultWalletServerBinderTest {
|
|||
val apiResponse = ApiResponse.Error(ApiResponseError.TimeoutException()) as ApiResponse<Unit>
|
||||
|
||||
coEvery { userWalletsStore.getSyncOrNull(userWalletId) } returns userWallet
|
||||
coEvery { appsFlyerConversionStore.get() } returns conversionData
|
||||
coEvery { appsFlyerStore.get() } returns conversionData
|
||||
coEvery { tangemTechApi.createWallet(requestBody) } returns apiResponse
|
||||
|
||||
val actual = binder.bind(userWalletId = userWalletId)
|
||||
|
|
@ -143,7 +143,7 @@ internal class DefaultWalletServerBinderTest {
|
|||
|
||||
coVerifyOrder {
|
||||
userWalletsStore.getSyncOrNull(userWalletId)
|
||||
appsFlyerConversionStore.get()
|
||||
appsFlyerStore.get()
|
||||
tangemTechApi.createWallet(requestBody)
|
||||
}
|
||||
}
|
||||
|
|
@ -164,7 +164,7 @@ internal class DefaultWalletServerBinderTest {
|
|||
)
|
||||
val apiResponse = ApiResponse.Success(Unit)
|
||||
|
||||
coEvery { appsFlyerConversionStore.get() } returns conversionData
|
||||
coEvery { appsFlyerStore.get() } returns conversionData
|
||||
coEvery { tangemTechApi.createWallet(requestBody) } returns apiResponse
|
||||
|
||||
val actual = binder.bind(userWallet = userWallet)
|
||||
|
|
@ -172,7 +172,7 @@ internal class DefaultWalletServerBinderTest {
|
|||
Truth.assertThat(actual).isEqualTo(apiResponse)
|
||||
|
||||
coVerifyOrder {
|
||||
appsFlyerConversionStore.get()
|
||||
appsFlyerStore.get()
|
||||
tangemTechApi.createWallet(requestBody)
|
||||
}
|
||||
}
|
||||
|
|
@ -186,7 +186,7 @@ internal class DefaultWalletServerBinderTest {
|
|||
)
|
||||
val apiResponse = ApiResponse.Success(Unit)
|
||||
|
||||
coEvery { appsFlyerConversionStore.get() } returns null
|
||||
coEvery { appsFlyerStore.get() } returns null
|
||||
coEvery { tangemTechApi.createWallet(requestBody) } returns apiResponse
|
||||
|
||||
val actual = binder.bind(userWallet = userWallet)
|
||||
|
|
@ -194,7 +194,7 @@ internal class DefaultWalletServerBinderTest {
|
|||
Truth.assertThat(actual).isEqualTo(apiResponse)
|
||||
|
||||
coVerifyOrder {
|
||||
appsFlyerConversionStore.get()
|
||||
appsFlyerStore.get()
|
||||
tangemTechApi.createWallet(requestBody)
|
||||
}
|
||||
}
|
||||
|
|
@ -210,7 +210,7 @@ internal class DefaultWalletServerBinderTest {
|
|||
)
|
||||
val apiResponse = ApiResponse.Error(ApiResponseError.TimeoutException()) as ApiResponse<Unit>
|
||||
|
||||
coEvery { appsFlyerConversionStore.get() } returns conversionData
|
||||
coEvery { appsFlyerStore.get() } returns conversionData
|
||||
coEvery { tangemTechApi.createWallet(requestBody) } returns apiResponse
|
||||
|
||||
val actual = binder.bind(userWallet = userWallet)
|
||||
|
|
@ -218,7 +218,7 @@ internal class DefaultWalletServerBinderTest {
|
|||
Truth.assertThat(actual).isEqualTo(apiResponse)
|
||||
|
||||
coVerifyOrder {
|
||||
appsFlyerConversionStore.get()
|
||||
appsFlyerStore.get()
|
||||
tangemTechApi.createWallet(requestBody)
|
||||
}
|
||||
}
|
||||
|
|
|
|||
|
|
@ -10,15 +10,17 @@ import com.tangem.datasource.api.common.response.ApiResponseError
|
|||
import com.tangem.datasource.api.common.response.getOrThrow
|
||||
import com.tangem.datasource.api.tangemTech.TangemTechApi
|
||||
import com.tangem.datasource.api.tangemTech.models.NotificationApplicationCreateBody
|
||||
import com.tangem.utils.info.AppInfoProvider
|
||||
import com.tangem.datasource.local.appsflyer.AppsFlyerStore
|
||||
import com.tangem.datasource.local.preferences.AppPreferencesStore
|
||||
import com.tangem.datasource.local.preferences.PreferencesKeys
|
||||
import com.tangem.datasource.local.preferences.utils.*
|
||||
import com.tangem.datasource.local.preferences.utils.getSyncOrNull
|
||||
import com.tangem.datasource.local.preferences.utils.store
|
||||
import com.tangem.domain.notifications.models.ApplicationId
|
||||
import com.tangem.domain.notifications.models.NotificationsError
|
||||
import com.tangem.domain.notifications.repository.PushNotificationsRepository
|
||||
import com.tangem.domain.notifications.models.NotificationsEligibleNetwork
|
||||
import com.tangem.utils.coroutines.CoroutineDispatcherProvider
|
||||
import com.tangem.utils.info.AppInfoProvider
|
||||
import kotlinx.coroutines.withContext
|
||||
import javax.inject.Inject
|
||||
|
||||
|
|
@ -26,6 +28,7 @@ internal class DefaultPushNotificationsRepository @Inject constructor(
|
|||
private val tangemTechApi: TangemTechApi,
|
||||
private val appInfoProvider: AppInfoProvider,
|
||||
private val appPreferencesStore: AppPreferencesStore,
|
||||
private val appsFlyerStore: AppsFlyerStore,
|
||||
private val dispatchers: CoroutineDispatcherProvider,
|
||||
) : PushNotificationsRepository {
|
||||
|
||||
|
|
@ -39,6 +42,7 @@ internal class DefaultPushNotificationsRepository @Inject constructor(
|
|||
timezone = appInfoProvider.timezone,
|
||||
version = appInfoProvider.appVersion,
|
||||
pushToken = pushToken,
|
||||
appsflyerId = appsFlyerStore.getUID(),
|
||||
),
|
||||
).getOrThrow().appId
|
||||
|
||||
|
|
|
|||
|
|
@ -3,20 +3,23 @@ package com.tangem.data.notifications
|
|||
import androidx.datastore.core.DataStore
|
||||
import androidx.datastore.preferences.core.Preferences
|
||||
import androidx.datastore.preferences.core.stringPreferencesKey
|
||||
import com.tangem.datasource.api.tangemTech.TangemTechApi
|
||||
import com.tangem.utils.info.AppInfoProvider
|
||||
import com.tangem.datasource.local.preferences.AppPreferencesStore
|
||||
import com.tangem.datasource.local.preferences.PreferencesKeys
|
||||
import com.google.common.truth.Truth.assertThat
|
||||
import com.squareup.moshi.Moshi
|
||||
import com.tangem.data.notifications.converters.NotificationsEligibleNetworkConverter
|
||||
import arrow.core.Either
|
||||
import com.tangem.datasource.api.common.response.ApiResponse
|
||||
import com.tangem.datasource.api.tangemTech.TangemTechApi
|
||||
import com.tangem.datasource.api.tangemTech.models.CryptoNetworkResponse
|
||||
import com.tangem.datasource.api.tangemTech.models.NotificationApplicationCreateBody
|
||||
import com.tangem.datasource.api.tangemTech.models.NotificationApplicationIdResponse
|
||||
import com.tangem.datasource.local.appsflyer.AppsFlyerStore
|
||||
import com.tangem.datasource.local.preferences.AppPreferencesStore
|
||||
import com.tangem.datasource.local.preferences.PreferencesKeys
|
||||
import com.tangem.datasource.api.common.response.ApiResponseError
|
||||
import com.tangem.datasource.api.tangemTech.models.*
|
||||
import com.tangem.domain.notifications.models.ApplicationId
|
||||
import com.tangem.domain.notifications.models.NotificationsError
|
||||
import com.tangem.utils.coroutines.TestingCoroutineDispatcherProvider
|
||||
import com.tangem.utils.info.AppInfoProvider
|
||||
import io.mockk.coEvery
|
||||
import io.mockk.coVerify
|
||||
import io.mockk.every
|
||||
|
|
@ -34,10 +37,12 @@ class DefaultPushNotificationsRepositoryTest {
|
|||
dispatchers = TestingCoroutineDispatcherProvider(),
|
||||
preferencesDataStore = preferencesDataStore,
|
||||
)
|
||||
private val appsFlyerStore: AppsFlyerStore = mockk()
|
||||
private val repository = DefaultPushNotificationsRepository(
|
||||
tangemTechApi = tangemTechApi,
|
||||
appInfoProvider = appInfoProvider,
|
||||
appPreferencesStore = appPreferencesStore,
|
||||
appsFlyerStore = appsFlyerStore,
|
||||
dispatchers = TestingCoroutineDispatcherProvider(),
|
||||
)
|
||||
|
||||
|
|
@ -55,6 +60,7 @@ class DefaultPushNotificationsRepositoryTest {
|
|||
coEvery { appInfoProvider.language } returns "en"
|
||||
coEvery { appInfoProvider.appVersion } returns "5.21.1"
|
||||
coEvery { appInfoProvider.timezone } returns "UTC"
|
||||
coEvery { appsFlyerStore.getUID() } returns "UID"
|
||||
coEvery { tangemTechApi.createApplicationId(any()) } returns ApiResponse.Success(
|
||||
expectedAppIdResponse,
|
||||
)
|
||||
|
|
@ -74,6 +80,7 @@ class DefaultPushNotificationsRepositoryTest {
|
|||
timezone = "UTC",
|
||||
version = "5.21.1",
|
||||
pushToken = pushToken,
|
||||
appsflyerId = "UID",
|
||||
),
|
||||
)
|
||||
}
|
||||
|
|
|
|||
|
|
@ -15,7 +15,7 @@ import com.tangem.datasource.api.tangemTech.TangemTechApi
|
|||
import com.tangem.datasource.api.tangemTech.converters.WalletIdBodyConverter
|
||||
import com.tangem.datasource.api.tangemTech.models.*
|
||||
import com.tangem.datasource.api.tangemTech.models.SeedPhraseNotificationDTO.Status
|
||||
import com.tangem.datasource.local.appsflyer.AppsFlyerConversionStore
|
||||
import com.tangem.datasource.local.appsflyer.AppsFlyerStore
|
||||
import com.tangem.datasource.local.datastore.RuntimeStateStore
|
||||
import com.tangem.datasource.local.preferences.AppPreferencesStore
|
||||
import com.tangem.datasource.local.preferences.PreferencesKeys
|
||||
|
|
@ -49,7 +49,7 @@ internal class DefaultWalletsRepository(
|
|||
private val dispatchers: CoroutineDispatcherProvider,
|
||||
private val authProvider: AuthProvider,
|
||||
private val walletServerBinder: WalletServerBinder,
|
||||
private val appsFlyerConversionStore: AppsFlyerConversionStore,
|
||||
private val appsFlyerStore: AppsFlyerStore,
|
||||
private val accountsFeatureToggles: AccountsFeatureToggles,
|
||||
private val moshi: com.squareup.moshi.Moshi,
|
||||
) : WalletsRepository {
|
||||
|
|
@ -411,7 +411,7 @@ internal class DefaultWalletsRepository(
|
|||
associateApplicationIdWithWallets().getOrThrow()
|
||||
}
|
||||
} else {
|
||||
val conversionData = appsFlyerConversionStore.get()
|
||||
val conversionData = appsFlyerStore.get()
|
||||
val publicKeys = authProvider.getCardsPublicKeys()
|
||||
val walletsBody = wallets.map { userWallet ->
|
||||
WalletIdBodyConverter.convert(
|
||||
|
|
|
|||
|
|
@ -12,7 +12,7 @@ import com.tangem.data.wallets.hot.DefaultHotWalletAccessCodeAttemptsRepository
|
|||
import com.tangem.datasource.api.common.AuthProvider
|
||||
import com.tangem.datasource.api.tangemTech.TangemTechApi
|
||||
import com.tangem.datasource.di.NetworkMoshi
|
||||
import com.tangem.datasource.local.appsflyer.AppsFlyerConversionStore
|
||||
import com.tangem.datasource.local.appsflyer.AppsFlyerStore
|
||||
import com.tangem.datasource.local.datastore.RuntimeStateStore
|
||||
import com.tangem.datasource.local.preferences.AppPreferencesStore
|
||||
import com.tangem.datasource.local.userwallet.UserWalletsStore
|
||||
|
|
@ -45,7 +45,7 @@ internal object WalletsDataModule {
|
|||
dispatchers: CoroutineDispatcherProvider,
|
||||
authProvider: AuthProvider,
|
||||
walletServerBinder: WalletServerBinder,
|
||||
appsFlyerConversionStore: AppsFlyerConversionStore,
|
||||
appsFlyerStore: AppsFlyerStore,
|
||||
accountsFeatureToggles: AccountsFeatureToggles,
|
||||
@NetworkMoshi moshi: Moshi,
|
||||
): WalletsRepository {
|
||||
|
|
@ -57,7 +57,7 @@ internal object WalletsDataModule {
|
|||
dispatchers = dispatchers,
|
||||
authProvider = authProvider,
|
||||
walletServerBinder = walletServerBinder,
|
||||
appsFlyerConversionStore = appsFlyerConversionStore,
|
||||
appsFlyerStore = appsFlyerStore,
|
||||
accountsFeatureToggles = accountsFeatureToggles,
|
||||
moshi = moshi,
|
||||
)
|
||||
|
|
|
|||
|
|
@ -12,7 +12,7 @@ import com.tangem.datasource.api.tangemTech.TangemTechApi
|
|||
import com.tangem.datasource.api.tangemTech.models.PromocodeActivationBody
|
||||
import com.tangem.datasource.api.tangemTech.models.PromocodeActivationResponse
|
||||
import com.tangem.datasource.api.tangemTech.models.WalletResponse
|
||||
import com.tangem.datasource.local.appsflyer.AppsFlyerConversionStore
|
||||
import com.tangem.datasource.local.appsflyer.AppsFlyerStore
|
||||
import com.tangem.datasource.local.preferences.AppPreferencesStore
|
||||
import com.tangem.datasource.local.preferences.PreferencesKeys
|
||||
import com.tangem.domain.account.featuretoggle.AccountsFeatureToggles
|
||||
|
|
@ -41,7 +41,7 @@ class DefaultWalletsRepositoryTest {
|
|||
private lateinit var tangemTechApi: TangemTechApi
|
||||
private lateinit var dispatchers: CoroutineDispatcherProvider
|
||||
private lateinit var walletServerBinder: WalletServerBinder
|
||||
private lateinit var appsFlyerConversionStore: AppsFlyerConversionStore
|
||||
private lateinit var appsFlyerStore: AppsFlyerStore
|
||||
|
||||
private val testWalletId = UserWalletId("1234567890abcdef")
|
||||
|
||||
|
|
@ -49,7 +49,7 @@ class DefaultWalletsRepositoryTest {
|
|||
fun setup() {
|
||||
tangemTechApi = mockk()
|
||||
walletServerBinder = mockk()
|
||||
appsFlyerConversionStore = mockk()
|
||||
appsFlyerStore = mockk()
|
||||
dispatchers = TestingCoroutineDispatcherProvider()
|
||||
repository = DefaultWalletsRepository(
|
||||
appPreferencesStore = appPreferenceStore,
|
||||
|
|
@ -59,7 +59,7 @@ class DefaultWalletsRepositoryTest {
|
|||
dispatchers = dispatchers,
|
||||
authProvider = mockk(),
|
||||
walletServerBinder = walletServerBinder,
|
||||
appsFlyerConversionStore = appsFlyerConversionStore,
|
||||
appsFlyerStore = appsFlyerStore,
|
||||
accountsFeatureToggles = mockk(),
|
||||
moshi = mockk(),
|
||||
)
|
||||
|
|
@ -227,12 +227,12 @@ class DefaultWalletsRepositoryTest {
|
|||
dispatchers = dispatchers,
|
||||
authProvider = authProvider,
|
||||
walletServerBinder = walletServerBinder,
|
||||
appsFlyerConversionStore = appsFlyerConversionStore,
|
||||
appsFlyerStore = appsFlyerStore,
|
||||
accountsFeatureToggles = accountsFeatureToggles,
|
||||
moshi = mockk(),
|
||||
)
|
||||
|
||||
coEvery { appsFlyerConversionStore.get() } returns null
|
||||
coEvery { appsFlyerStore.get() } returns null
|
||||
|
||||
coEvery {
|
||||
tangemTechApi.associateApplicationIdWithWallets(
|
||||
|
|
|
|||
File diff suppressed because it is too large
Load diff
|
|
@ -97,9 +97,12 @@ private fun DisclaimerContent(url: String) {
|
|||
val webViewNavigator = rememberWebViewNavigator()
|
||||
val webViewClient = remember {
|
||||
DisclaimerWebViewClient(
|
||||
onLoadingFinished = {
|
||||
onLoadingFinished = { isWithError ->
|
||||
loadingTimeoutJobHolder.cancel()
|
||||
isLoading = false
|
||||
if (isWithError) {
|
||||
webViewNavigator.loadLocalToS()
|
||||
}
|
||||
},
|
||||
)
|
||||
}
|
||||
|
|
|
|||
|
|
@ -16,7 +16,7 @@ import timber.log.Timber
|
|||
*/
|
||||
@Suppress("NullableToStringCall")
|
||||
internal class DisclaimerWebViewClient(
|
||||
private val onLoadingFinished: () -> Unit,
|
||||
private val onLoadingFinished: (isWithError: Boolean) -> Unit,
|
||||
) : AccompanistWebViewClient() {
|
||||
|
||||
private val loadedUrls: MutableMap<String, Boolean> = mutableMapOf()
|
||||
|
|
@ -25,7 +25,6 @@ internal class DisclaimerWebViewClient(
|
|||
super.onPageStarted(view, url, favicon)
|
||||
|
||||
Timber.d("onPageStarted: $url")
|
||||
|
||||
if (url != null) {
|
||||
loadedUrls[url] = false
|
||||
}
|
||||
|
|
@ -35,10 +34,9 @@ internal class DisclaimerWebViewClient(
|
|||
super.onPageFinished(view, url)
|
||||
|
||||
Timber.d("onPageFinished: $url")
|
||||
|
||||
if (url != null && loadedUrls.containsKey(url)) {
|
||||
loadedUrls[url] = true
|
||||
onLoadingFinished()
|
||||
onLoadingFinished(false)
|
||||
}
|
||||
}
|
||||
|
||||
|
|
@ -51,7 +49,7 @@ internal class DisclaimerWebViewClient(
|
|||
|
||||
if (url != null && loadedUrls.containsKey(url)) {
|
||||
loadedUrls[url] = true
|
||||
onLoadingFinished()
|
||||
onLoadingFinished(true)
|
||||
}
|
||||
}
|
||||
}
|
||||
|
|
@ -252,7 +252,7 @@ private fun PaymentBlockInOffer(paymentMethod: OnrampPaymentMethod, providerName
|
|||
SpacerW(6.dp)
|
||||
|
||||
Text(
|
||||
text = providerName,
|
||||
text = stringResourceSafe(R.string.onramp_via_provider, providerName),
|
||||
style = TangemTheme.typography.caption2,
|
||||
color = TangemTheme.colors.text.tertiary,
|
||||
modifier = Modifier.testTag(OnrampOffersBlockTestTags.PROVIDER_NAME),
|
||||
|
|
|
|||
|
|
@ -10,7 +10,7 @@ import com.tangem.core.ui.extensions.mask
|
|||
import com.tangem.core.ui.extensions.resourceReference
|
||||
import com.tangem.core.ui.message.DialogMessage
|
||||
import com.tangem.core.ui.message.GlobalLoadingMessage
|
||||
import com.tangem.datasource.local.appsflyer.AppsFlyerConversionStore
|
||||
import com.tangem.datasource.local.appsflyer.AppsFlyerStore
|
||||
import com.tangem.domain.models.network.NetworkStatus
|
||||
import com.tangem.domain.models.wallet.UserWallet
|
||||
import com.tangem.domain.networks.multi.MultiNetworkStatusProducer
|
||||
|
|
@ -48,7 +48,7 @@ internal class DefaultPromoDeeplinkHandler @AssistedInject constructor(
|
|||
private val multiWalletCryptoCurrenciesSupplier: MultiWalletCryptoCurrenciesSupplier,
|
||||
private val activateBitcoinPromocodeUseCase: ActivateBitcoinPromocodeUseCase,
|
||||
private val getSelectedWalletSyncUseCase: GetSelectedWalletSyncUseCase,
|
||||
private val appsFlyerConversionStore: AppsFlyerConversionStore,
|
||||
private val appsFlyerStore: AppsFlyerStore,
|
||||
private val bindRefcodeWithWalletUseCase: BindRefcodeWithWalletUseCase,
|
||||
private val analyticsEventsHandler: AnalyticsEventHandler,
|
||||
private val dispatchers: CoroutineDispatcherProvider,
|
||||
|
|
@ -194,7 +194,7 @@ internal class DefaultPromoDeeplinkHandler @AssistedInject constructor(
|
|||
if (!refcode.isNullOrBlank()) {
|
||||
val conversionData = AppsFlyerConversionData(refcode = refcode, campaign = campaign)
|
||||
|
||||
appsFlyerConversionStore.storeIfAbsent(value = conversionData)
|
||||
appsFlyerStore.storeIfAbsent(value = conversionData)
|
||||
|
||||
bindRefcodeWithWalletUseCase(conversionData)
|
||||
.onLeft { Timber.e("Failed to bind refcode with wallets: $it") }
|
||||
|
|
|
|||
|
|
@ -60,7 +60,7 @@ internal class WalletWarningsSingleEventSender @Inject constructor(
|
|||
// We check that map contains the first seen wallet (will return null instead false/true otherwise)
|
||||
// and for this wallet we haven't shown the activation bs yet (check that returns false, not true)
|
||||
if (isActivationBottomSheetShown[userWalletId] == false) {
|
||||
if (event.type == WalletActivationBannerType.Warning) {
|
||||
if (event.type == WalletActivationBannerType.Warning && event.isBackupExists.not()) {
|
||||
showFinishActivationBottomSheet(userWalletId)
|
||||
}
|
||||
isActivationBottomSheetShown[userWalletId] = true
|
||||
|
|
|
|||
|
|
@ -12,7 +12,7 @@ import com.tangem.core.decompose.ui.UiMessageSender
|
|||
import com.tangem.core.ui.extensions.TextReference
|
||||
import com.tangem.core.ui.extensions.resourceReference
|
||||
import com.tangem.core.ui.message.DialogMessage
|
||||
import com.tangem.datasource.local.appsflyer.AppsFlyerConversionStore
|
||||
import com.tangem.datasource.local.appsflyer.AppsFlyerStore
|
||||
import com.tangem.domain.models.StatusSource
|
||||
import com.tangem.domain.models.currency.CryptoCurrency
|
||||
import com.tangem.domain.models.network.Network
|
||||
|
|
@ -72,7 +72,7 @@ class DefaultPromoDeeplinkHandlerTest {
|
|||
private lateinit var bindRefcodeWithWalletUseCase: BindRefcodeWithWalletUseCase
|
||||
|
||||
@MockK
|
||||
private lateinit var appsFlyerConversionStore: AppsFlyerConversionStore
|
||||
private lateinit var appsFlyerStore: AppsFlyerStore
|
||||
|
||||
private lateinit var messages: MutableList<UiMessage>
|
||||
|
||||
|
|
@ -114,7 +114,7 @@ class DefaultPromoDeeplinkHandlerTest {
|
|||
activateBitcoinPromocodeUseCase = activateBitcoinPromocodeUseCase,
|
||||
getSelectedWalletSyncUseCase = getSelectedWalletSyncUseCase,
|
||||
bindRefcodeWithWalletUseCase = bindRefcodeWithWalletUseCase,
|
||||
appsFlyerConversionStore = appsFlyerConversionStore,
|
||||
appsFlyerStore = appsFlyerStore,
|
||||
analyticsEventsHandler = analyticsEventHandler,
|
||||
dispatchers = dispatcherProvider,
|
||||
)
|
||||
|
|
@ -148,7 +148,7 @@ class DefaultPromoDeeplinkHandlerTest {
|
|||
activateBitcoinPromocodeUseCase = activateBitcoinPromocodeUseCase,
|
||||
getSelectedWalletSyncUseCase = getSelectedWalletSyncUseCase,
|
||||
bindRefcodeWithWalletUseCase = bindRefcodeWithWalletUseCase,
|
||||
appsFlyerConversionStore = appsFlyerConversionStore,
|
||||
appsFlyerStore = appsFlyerStore,
|
||||
analyticsEventsHandler = analyticsEventHandler,
|
||||
dispatchers = TestingCoroutineDispatcherProvider(),
|
||||
)
|
||||
|
|
@ -181,7 +181,7 @@ class DefaultPromoDeeplinkHandlerTest {
|
|||
activateBitcoinPromocodeUseCase = activateBitcoinPromocodeUseCase,
|
||||
getSelectedWalletSyncUseCase = getSelectedWalletSyncUseCase,
|
||||
bindRefcodeWithWalletUseCase = bindRefcodeWithWalletUseCase,
|
||||
appsFlyerConversionStore = appsFlyerConversionStore,
|
||||
appsFlyerStore = appsFlyerStore,
|
||||
analyticsEventsHandler = analyticsEventHandler,
|
||||
dispatchers = TestingCoroutineDispatcherProvider(),
|
||||
)
|
||||
|
|
@ -220,7 +220,7 @@ class DefaultPromoDeeplinkHandlerTest {
|
|||
activateBitcoinPromocodeUseCase = activateBitcoinPromocodeUseCase,
|
||||
getSelectedWalletSyncUseCase = getSelectedWalletSyncUseCase,
|
||||
bindRefcodeWithWalletUseCase = bindRefcodeWithWalletUseCase,
|
||||
appsFlyerConversionStore = appsFlyerConversionStore,
|
||||
appsFlyerStore = appsFlyerStore,
|
||||
analyticsEventsHandler = analyticsEventHandler,
|
||||
dispatchers = dispatcherProvider,
|
||||
)
|
||||
|
|
@ -263,7 +263,7 @@ class DefaultPromoDeeplinkHandlerTest {
|
|||
activateBitcoinPromocodeUseCase = activateBitcoinPromocodeUseCase,
|
||||
getSelectedWalletSyncUseCase = getSelectedWalletSyncUseCase,
|
||||
bindRefcodeWithWalletUseCase = bindRefcodeWithWalletUseCase,
|
||||
appsFlyerConversionStore = appsFlyerConversionStore,
|
||||
appsFlyerStore = appsFlyerStore,
|
||||
analyticsEventsHandler = analyticsEventHandler,
|
||||
dispatchers = dispatcherProvider,
|
||||
)
|
||||
|
|
@ -381,7 +381,7 @@ class DefaultPromoDeeplinkHandlerTest {
|
|||
activateBitcoinPromocodeUseCase = activateBitcoinPromocodeUseCase,
|
||||
getSelectedWalletSyncUseCase = getSelectedWalletSyncUseCase,
|
||||
bindRefcodeWithWalletUseCase = bindRefcodeWithWalletUseCase,
|
||||
appsFlyerConversionStore = appsFlyerConversionStore,
|
||||
appsFlyerStore = appsFlyerStore,
|
||||
analyticsEventsHandler = analyticsEventHandler,
|
||||
dispatchers = dispatcherProvider,
|
||||
)
|
||||
|
|
@ -414,7 +414,7 @@ class DefaultPromoDeeplinkHandlerTest {
|
|||
activateBitcoinPromocodeUseCase = activateBitcoinPromocodeUseCase,
|
||||
getSelectedWalletSyncUseCase = getSelectedWalletSyncUseCase,
|
||||
bindRefcodeWithWalletUseCase = bindRefcodeWithWalletUseCase,
|
||||
appsFlyerConversionStore = appsFlyerConversionStore,
|
||||
appsFlyerStore = appsFlyerStore,
|
||||
analyticsEventsHandler = analyticsEventHandler,
|
||||
dispatchers = dispatcherProvider,
|
||||
)
|
||||
|
|
@ -456,7 +456,7 @@ class DefaultPromoDeeplinkHandlerTest {
|
|||
activateBitcoinPromocodeUseCase = activateBitcoinPromocodeUseCase,
|
||||
getSelectedWalletSyncUseCase = getSelectedWalletSyncUseCase,
|
||||
bindRefcodeWithWalletUseCase = bindRefcodeWithWalletUseCase,
|
||||
appsFlyerConversionStore = appsFlyerConversionStore,
|
||||
appsFlyerStore = appsFlyerStore,
|
||||
analyticsEventsHandler = analyticsEventHandler,
|
||||
dispatchers = dispatcherProvider,
|
||||
)
|
||||
|
|
@ -519,7 +519,7 @@ class DefaultPromoDeeplinkHandlerTest {
|
|||
activateBitcoinPromocodeUseCase = activateBitcoinPromocodeUseCase,
|
||||
getSelectedWalletSyncUseCase = getSelectedWalletSyncUseCase,
|
||||
bindRefcodeWithWalletUseCase = bindRefcodeWithWalletUseCase,
|
||||
appsFlyerConversionStore = appsFlyerConversionStore,
|
||||
appsFlyerStore = appsFlyerStore,
|
||||
analyticsEventsHandler = analyticsEventHandler,
|
||||
dispatchers = dispatcherProvider,
|
||||
)
|
||||
|
|
@ -573,7 +573,7 @@ class DefaultPromoDeeplinkHandlerTest {
|
|||
activateBitcoinPromocodeUseCase = activateBitcoinPromocodeUseCase,
|
||||
getSelectedWalletSyncUseCase = getSelectedWalletSyncUseCase,
|
||||
bindRefcodeWithWalletUseCase = bindRefcodeWithWalletUseCase,
|
||||
appsFlyerConversionStore = appsFlyerConversionStore,
|
||||
appsFlyerStore = appsFlyerStore,
|
||||
analyticsEventsHandler = analyticsEventHandler,
|
||||
dispatchers = dispatcherProvider,
|
||||
)
|
||||
|
|
@ -633,7 +633,7 @@ class DefaultPromoDeeplinkHandlerTest {
|
|||
activateBitcoinPromocodeUseCase = activateBitcoinPromocodeUseCase,
|
||||
getSelectedWalletSyncUseCase = getSelectedWalletSyncUseCase,
|
||||
bindRefcodeWithWalletUseCase = bindRefcodeWithWalletUseCase,
|
||||
appsFlyerConversionStore = appsFlyerConversionStore,
|
||||
appsFlyerStore = appsFlyerStore,
|
||||
analyticsEventsHandler = analyticsEventHandler,
|
||||
dispatchers = dispatcherProvider,
|
||||
)
|
||||
|
|
@ -692,7 +692,7 @@ class DefaultPromoDeeplinkHandlerTest {
|
|||
activateBitcoinPromocodeUseCase = activateBitcoinPromocodeUseCase,
|
||||
getSelectedWalletSyncUseCase = getSelectedWalletSyncUseCase,
|
||||
bindRefcodeWithWalletUseCase = bindRefcodeWithWalletUseCase,
|
||||
appsFlyerConversionStore = appsFlyerConversionStore,
|
||||
appsFlyerStore = appsFlyerStore,
|
||||
analyticsEventsHandler = analyticsEventHandler,
|
||||
dispatchers = dispatcherProvider,
|
||||
)
|
||||
|
|
@ -747,7 +747,7 @@ class DefaultPromoDeeplinkHandlerTest {
|
|||
activateBitcoinPromocodeUseCase = activateBitcoinPromocodeUseCase,
|
||||
getSelectedWalletSyncUseCase = getSelectedWalletSyncUseCase,
|
||||
bindRefcodeWithWalletUseCase = bindRefcodeWithWalletUseCase,
|
||||
appsFlyerConversionStore = appsFlyerConversionStore,
|
||||
appsFlyerStore = appsFlyerStore,
|
||||
analyticsEventsHandler = analyticsEventHandler,
|
||||
dispatchers = dispatcherProvider,
|
||||
)
|
||||
|
|
@ -802,7 +802,7 @@ class DefaultPromoDeeplinkHandlerTest {
|
|||
activateBitcoinPromocodeUseCase = activateBitcoinPromocodeUseCase,
|
||||
getSelectedWalletSyncUseCase = getSelectedWalletSyncUseCase,
|
||||
bindRefcodeWithWalletUseCase = bindRefcodeWithWalletUseCase,
|
||||
appsFlyerConversionStore = appsFlyerConversionStore,
|
||||
appsFlyerStore = appsFlyerStore,
|
||||
analyticsEventsHandler = analyticsEventHandler,
|
||||
dispatchers = dispatcherProvider,
|
||||
)
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue