diff --git a/app/src/main/java/com/tangem/tap/MainActivity.kt b/app/src/main/java/com/tangem/tap/MainActivity.kt index b300ea02c8..3249b8d1b5 100644 --- a/app/src/main/java/com/tangem/tap/MainActivity.kt +++ b/app/src/main/java/com/tangem/tap/MainActivity.kt @@ -20,8 +20,8 @@ import com.tangem.tap.common.extensions.dispatchOnMain import com.tangem.tap.common.redux.NotificationsHandler import com.tangem.tap.common.redux.navigation.AppScreen import com.tangem.tap.common.redux.navigation.NavigationAction -import com.tangem.tap.common.shop.GooglePayService -import com.tangem.tap.common.shop.GooglePayService.Companion.LOAD_PAYMENT_DATA_REQUEST_CODE +import com.tangem.tap.common.shop.googlepay.GooglePayService +import com.tangem.tap.common.shop.googlepay.GooglePayService.Companion.LOAD_PAYMENT_DATA_REQUEST_CODE import com.tangem.tap.common.shop.googlepay.GooglePayUtil.createPaymentsClient import com.tangem.tap.domain.TangemSdkManager import com.tangem.tap.domain.userWalletList.UserWalletsListManager @@ -120,7 +120,8 @@ class MainActivity : AppCompatActivity(), SnackbarHandler, ActivityResultCallbac val isScannedBefore = store.state.globalState.scanResponse != null val isOnboardingServiceActive = store.state.globalState.onboardingState.onboardingStarted val shopOpened = store.state.shopState.total != null - if (backStackIsEmpty || (!isOnboardingServiceActive && !isScannedBefore && !shopOpened)) { + @Suppress("ComplexCondition") + if (backStackIsEmpty || !isOnboardingServiceActive && !isScannedBefore && !shopOpened) { if (userWalletsListManager.hasSavedUserWallets) { store.dispatchOnMain(WelcomeAction.HandleDeepLink(intent)) store.dispatchOnMain(NavigationAction.NavigateTo(AppScreen.Welcome)) diff --git a/app/src/main/java/com/tangem/tap/TapApplication.kt b/app/src/main/java/com/tangem/tap/TapApplication.kt index 608ca53cbe..d05473f112 100644 --- a/app/src/main/java/com/tangem/tap/TapApplication.kt +++ b/app/src/main/java/com/tangem/tap/TapApplication.kt @@ -173,7 +173,7 @@ class TapApplication : Application(), ImageLoaderFactory { private fun initWithConfigDependency(config: Config) { shopService = TangemShopService(this, config.shopify!!) initAnalytics(this, config) - initFeedbackManager(this, preferencesStorage, config) + initFeedbackManager(this, preferencesStorage) } private fun initAnalytics(application: Application, config: Config) { @@ -196,7 +196,7 @@ class TapApplication : Application(), ImageLoaderFactory { factory.build(Analytics, buildData) } - private fun initFeedbackManager(context: Context, preferencesStorage: PreferencesStorage, config: Config) { + private fun initFeedbackManager(context: Context, preferencesStorage: PreferencesStorage) { fun initAdditionalFeedbackInfo(context: Context): AdditionalFeedbackInfo = AdditionalFeedbackInfo().apply { appVersion = try { val pInfo = context.packageManager.getPackageInfo(context.packageName, 0) diff --git a/app/src/main/java/com/tangem/tap/WaitForMigration.kt b/app/src/main/java/com/tangem/tap/WaitForMigration.kt index 536b9711eb..59c14fb064 100644 --- a/app/src/main/java/com/tangem/tap/WaitForMigration.kt +++ b/app/src/main/java/com/tangem/tap/WaitForMigration.kt @@ -4,4 +4,4 @@ package com.tangem.tap [REDACTED_AUTHOR] */ -val DELAY_SDK_DIALOG_CLOSE = 1400L \ No newline at end of file +const val DELAY_SDK_DIALOG_CLOSE = 1400L \ No newline at end of file diff --git a/app/src/main/java/com/tangem/tap/common/DialogManager.kt b/app/src/main/java/com/tangem/tap/common/DialogManager.kt index 595d9b6fad..60be5dd746 100644 --- a/app/src/main/java/com/tangem/tap/common/DialogManager.kt +++ b/app/src/main/java/com/tangem/tap/common/DialogManager.kt @@ -56,6 +56,7 @@ class DialogManager : StoreSubscriber { store.unsubscribe(this) } + @Suppress("LongMethod", "ComplexMethod") override fun newState(state: GlobalState) { if (state.dialog == null) { dialog?.dismiss() @@ -73,7 +74,7 @@ class DialogManager : StoreSubscriber { is AppDialog.ScanFailsDialog -> ScanFailsDialog.create(context) is AppDialog.AddressInfoDialog -> AddressInfoBottomSheetDialog(state.dialog, context) is AppDialog.TestActionsDialog -> TestActionsBottomSheetDialog(state.dialog, context) - is TwinCardsAction.Wallet.ShowInterruptDialog -> CreateWalletInterruptDialog.create(state.dialog, context) + is TwinCardsAction.Wallet.ShowInterruptDialog -> CreateWalletInterruptDialog.create(context) is OnboardingDialog.InterruptOnboarding -> InterruptOnboardingDialog.create(context, state.dialog) is WalletConnectDialog.UnsupportedCard -> SimpleAlertDialog.create( diff --git a/app/src/main/java/com/tangem/tap/common/KeyboardObserver.kt b/app/src/main/java/com/tangem/tap/common/KeyboardObserver.kt index 69581a7a34..47f579ca1b 100644 --- a/app/src/main/java/com/tangem/tap/common/KeyboardObserver.kt +++ b/app/src/main/java/com/tangem/tap/common/KeyboardObserver.kt @@ -44,7 +44,7 @@ class KeyboardObserver(activity: Activity) { onKeyboardListener?.invoke(isShow) } - private fun isSoftKeyChanged() = ((lastWindowHeight - getWindowHeight()).absoluteValue) == getSoftKeyButtonHeight() + private fun isSoftKeyChanged() = (lastWindowHeight - getWindowHeight()).absoluteValue == getSoftKeyButtonHeight() private fun getSoftKeyButtonHeight(): Int { val applicationDisplayHeight = DisplayMetrics().apply { @@ -57,5 +57,4 @@ class KeyboardObserver(activity: Activity) { return realDisplayHeight - applicationDisplayHeight } - } \ No newline at end of file diff --git a/app/src/main/java/com/tangem/tap/common/TestActions.kt b/app/src/main/java/com/tangem/tap/common/TestActions.kt index 5eb1021886..b787e7a1b3 100644 --- a/app/src/main/java/com/tangem/tap/common/TestActions.kt +++ b/app/src/main/java/com/tangem/tap/common/TestActions.kt @@ -40,9 +40,10 @@ typealias TestAction = Pair Unit> class TestActionsBottomSheetDialog( private val appDialog: AppDialog.TestActionsDialog, - context: Context + context: Context, ) : BottomSheetDialog(context) { + @Suppress("MagicNumber") override fun onCreate(savedInstanceState: Bundle?) { super.onCreate(savedInstanceState) diff --git a/app/src/main/java/com/tangem/tap/common/analytics/AnalyticsEventsLogger.kt b/app/src/main/java/com/tangem/tap/common/analytics/AnalyticsEventsLogger.kt index 6b5a1fc3a2..39291d12f6 100644 --- a/app/src/main/java/com/tangem/tap/common/analytics/AnalyticsEventsLogger.kt +++ b/app/src/main/java/com/tangem/tap/common/analytics/AnalyticsEventsLogger.kt @@ -1,8 +1,8 @@ package com.tangem.tap.common.analytics import com.tangem.common.json.MoshiJsonConverter -import com.tangem.analytics.api.ErrorEventLogger -import com.tangem.analytics.api.EventLogger +import com.tangem.core.analytics.api.ErrorEventLogger +import com.tangem.core.analytics.api.EventLogger import timber.log.Timber class AnalyticsEventsLogger( diff --git a/app/src/main/java/com/tangem/tap/common/analytics/TangemSdkError.kt b/app/src/main/java/com/tangem/tap/common/analytics/TangemSdkErrorMapper.kt similarity index 98% rename from app/src/main/java/com/tangem/tap/common/analytics/TangemSdkError.kt rename to app/src/main/java/com/tangem/tap/common/analytics/TangemSdkErrorMapper.kt index 491ef8f683..5a157d6372 100644 --- a/app/src/main/java/com/tangem/tap/common/analytics/TangemSdkError.kt +++ b/app/src/main/java/com/tangem/tap/common/analytics/TangemSdkErrorMapper.kt @@ -2,10 +2,11 @@ package com.tangem.tap.common.analytics import com.tangem.common.core.TangemSdkError -object TangemSdk { +object TangemSdkErrorMapper { // This mapping is performed to group errors in FirebaseCrashlytics. // At the moment, the errors in Crashlytics can only be grouped by their place of creation (class and line). + @Suppress("LongMethod", "ComplexMethod") fun map(error: TangemSdkError): TangemSdkError { return when (error) { is TangemSdkError.TagLost -> TangemSdkError.TagLost() @@ -90,7 +91,8 @@ object TangemSdk { is TangemSdkError.BackupFailedEmptyWallets -> TangemSdkError.BackupFailedEmptyWallets() is TangemSdkError.BackupFailedNotEmptyWallets -> TangemSdkError.BackupFailedNotEmptyWallets() is TangemSdkError.NoActiveBackup -> TangemSdkError.NoActiveBackup() - is TangemSdkError.ResetBackupFailedHasBackupedWallets -> TangemSdkError.ResetBackupFailedHasBackupedWallets() + is TangemSdkError.ResetBackupFailedHasBackupedWallets -> + TangemSdkError.ResetBackupFailedHasBackupedWallets() is TangemSdkError.BackupServiceInvalidState -> TangemSdkError.BackupServiceInvalidState() is TangemSdkError.NoBackupCardForIndex -> TangemSdkError.NoBackupCardForIndex() is TangemSdkError.EmptyBackupCards -> TangemSdkError.EmptyBackupCards() diff --git a/app/src/main/java/com/tangem/tap/common/analytics/converters/BasicEventConverter.kt b/app/src/main/java/com/tangem/tap/common/analytics/converters/BasicEventConverter.kt index 52fa450434..21a9dbbaf6 100644 --- a/app/src/main/java/com/tangem/tap/common/analytics/converters/BasicEventConverter.kt +++ b/app/src/main/java/com/tangem/tap/common/analytics/converters/BasicEventConverter.kt @@ -53,7 +53,9 @@ class BasicTopUpEventConverter( } } -private fun AnalyticsParam.CardBalanceState.Companion.from(walletsData: List): AnalyticsParam.CardBalanceState { +private fun AnalyticsParam.CardBalanceState.Companion.from( + walletsData: List, +): AnalyticsParam.CardBalanceState { val totalCryptoAmount = walletsData.calculateTotalCryptoAmount() return when { totalCryptoAmount.isZero() -> AnalyticsParam.CardBalanceState.Empty diff --git a/app/src/main/java/com/tangem/tap/common/analytics/events/AnalyticsParam.kt b/app/src/main/java/com/tangem/tap/common/analytics/events/AnalyticsParam.kt index bad36d3f0d..2e5a925560 100644 --- a/app/src/main/java/com/tangem/tap/common/analytics/events/AnalyticsParam.kt +++ b/app/src/main/java/com/tangem/tap/common/analytics/events/AnalyticsParam.kt @@ -8,7 +8,10 @@ sealed class AnalyticsParam { class Currency(currency: com.tangem.tap.features.wallet.models.Currency) : CurrencyType(currency.currencySymbol) class Blockchain(blockchain: com.tangem.blockchain.common.Blockchain) : CurrencyType(blockchain.currency) class Token(token: com.tangem.blockchain.common.Token) : CurrencyType(token.symbol) - class FiatCurrency(fiatCurrency: com.tangem.tap.common.entities.FiatCurrency) : CurrencyType(fiatCurrency.symbol) + class FiatCurrency( + fiatCurrency: com.tangem.tap.common.entities.FiatCurrency, + ) : CurrencyType(fiatCurrency.symbol) + class Amount(amount: com.tangem.blockchain.common.Amount) : CurrencyType(amount.currencySymbol) } diff --git a/app/src/main/java/com/tangem/tap/common/analytics/handlers/amplitude/AmplitudeClient.kt b/app/src/main/java/com/tangem/tap/common/analytics/handlers/amplitude/AmplitudeClient.kt index 80f8359025..ddb27d18ff 100644 --- a/app/src/main/java/com/tangem/tap/common/analytics/handlers/amplitude/AmplitudeClient.kt +++ b/app/src/main/java/com/tangem/tap/common/analytics/handlers/amplitude/AmplitudeClient.kt @@ -4,7 +4,7 @@ import android.app.Application import com.amplitude.api.Amplitude import com.amplitude.api.AmplitudeClient import com.tangem.common.Converter -import com.tangem.analytics.api.EventLogger +import com.tangem.core.analytics.api.EventLogger import org.json.JSONObject /** diff --git a/app/src/main/java/com/tangem/tap/common/analytics/handlers/appsFlyer/AppsFlyerClient.kt b/app/src/main/java/com/tangem/tap/common/analytics/handlers/appsFlyer/AppsFlyerClient.kt index b8271cc6af..40cee4e698 100644 --- a/app/src/main/java/com/tangem/tap/common/analytics/handlers/appsFlyer/AppsFlyerClient.kt +++ b/app/src/main/java/com/tangem/tap/common/analytics/handlers/appsFlyer/AppsFlyerClient.kt @@ -2,7 +2,7 @@ package com.tangem.tap.common.analytics.handlers.appsFlyer import android.content.Context import com.appsflyer.AppsFlyerLib -import com.tangem.analytics.api.EventLogger +import com.tangem.core.analytics.api.EventLogger /** [REDACTED_AUTHOR] diff --git a/app/src/main/java/com/tangem/tap/common/analytics/handlers/firebase/FirebaseClient.kt b/app/src/main/java/com/tangem/tap/common/analytics/handlers/firebase/FirebaseClient.kt index 3db2ed90bc..33751b5e0a 100644 --- a/app/src/main/java/com/tangem/tap/common/analytics/handlers/firebase/FirebaseClient.kt +++ b/app/src/main/java/com/tangem/tap/common/analytics/handlers/firebase/FirebaseClient.kt @@ -6,8 +6,8 @@ import com.google.firebase.analytics.FirebaseAnalytics import com.google.firebase.analytics.ktx.analytics import com.google.firebase.crashlytics.ktx.crashlytics import com.google.firebase.ktx.Firebase -import com.tangem.analytics.api.ErrorEventLogger -import com.tangem.analytics.api.EventLogger +import com.tangem.core.analytics.api.ErrorEventLogger +import com.tangem.core.analytics.api.EventLogger /** [REDACTED_AUTHOR] diff --git a/app/src/main/java/com/tangem/tap/common/compose/AutoSizeText.kt b/app/src/main/java/com/tangem/tap/common/compose/AutoSizeText.kt index 324fd3877e..414473177d 100644 --- a/app/src/main/java/com/tangem/tap/common/compose/AutoSizeText.kt +++ b/app/src/main/java/com/tangem/tap/common/compose/AutoSizeText.kt @@ -11,6 +11,7 @@ import androidx.compose.ui.text.TextStyle import androidx.compose.ui.unit.TextUnit import androidx.compose.ui.unit.sp +@Suppress("MagicNumber") @Composable fun TextAutoSize( modifier: Modifier = Modifier, @@ -46,7 +47,7 @@ fun TextAutoSize( } else { readyToDraw.value = true } - } + }, ) } diff --git a/app/src/main/java/com/tangem/tap/common/compose/Theme.kt b/app/src/main/java/com/tangem/tap/common/compose/NoRippleTheme.kt similarity index 100% rename from app/src/main/java/com/tangem/tap/common/compose/Theme.kt rename to app/src/main/java/com/tangem/tap/common/compose/NoRippleTheme.kt diff --git a/app/src/main/java/com/tangem/tap/common/compose/OutlinedSpinner.kt b/app/src/main/java/com/tangem/tap/common/compose/OutlinedSpinner.kt index 3792119da9..4c2a91e791 100644 --- a/app/src/main/java/com/tangem/tap/common/compose/OutlinedSpinner.kt +++ b/app/src/main/java/com/tangem/tap/common/compose/OutlinedSpinner.kt @@ -17,6 +17,7 @@ import com.tangem.tap.common.extensions.ValueCallback /** [REDACTED_AUTHOR] */ +@Suppress("MagicNumber") @OptIn(ExperimentalMaterialApi::class) @Composable fun OutlinedSpinner( @@ -95,7 +96,7 @@ class ClosePopupTrigger { @Preview @Composable fun TestSpinnerPreview() { - Scaffold() { + Scaffold { OutlinedSpinner( label = "Blockchain name", itemList = listOf(Blockchain.values()), diff --git a/app/src/main/java/com/tangem/tap/common/compose/OutlinedTextFieldWidget.kt b/app/src/main/java/com/tangem/tap/common/compose/OutlinedTextFieldWidget.kt index deacbaf05f..ecffb1c422 100644 --- a/app/src/main/java/com/tangem/tap/common/compose/OutlinedTextFieldWidget.kt +++ b/app/src/main/java/com/tangem/tap/common/compose/OutlinedTextFieldWidget.kt @@ -78,6 +78,7 @@ fun OutlinedTextFieldWidget( } } +@Suppress("LongMethod", "NestedBlockDepth", "MagicNumber", "MaxLineLength") @Composable private fun OutlinedProgressTextField( modifier: Modifier = Modifier, @@ -127,7 +128,7 @@ private fun OutlinedProgressTextField( logger.log("$isNotUserInput: внешние данные ОДИНАКОВЫ с данными в поле") } else { logger.log("$isNotUserInput: внешние данные РАЗЛИЧАЮТСЯ с данными в поле") - if ((textDebouncer.emittedValue != textDebouncer.debounced) || textDebouncer.emitsCountBeforeDebounce > 0) { + if (textDebouncer.emittedValue != textDebouncer.debounced || textDebouncer.emitsCountBeforeDebounce > 0) { logger.log("$isNotUserInput: пользователь ВВОДИТ данные -> внешние данные игнорируем, ждем RECOMPOSE") } else { logger.log("$isNotUserInput: пользователь НЕ вводит данные -> пытаемся обработать внешние данные") diff --git a/app/src/main/java/com/tangem/tap/common/compose/PinCodeWidget.kt b/app/src/main/java/com/tangem/tap/common/compose/PinCodeWidget.kt index ad7bbe794b..f7dad88a0d 100644 --- a/app/src/main/java/com/tangem/tap/common/compose/PinCodeWidget.kt +++ b/app/src/main/java/com/tangem/tap/common/compose/PinCodeWidget.kt @@ -125,10 +125,6 @@ private fun PinElement( } } -@Composable -private fun HiddenInputField() { -} - private fun createPinSymbolsList(size: Int, text: String): List = List(size) { try { text[it].toString() diff --git a/app/src/main/java/com/tangem/tap/common/compose/extensions/Color.kt b/app/src/main/java/com/tangem/tap/common/compose/extensions/Color.kt deleted file mode 100644 index d25bc9e26b..0000000000 --- a/app/src/main/java/com/tangem/tap/common/compose/extensions/Color.kt +++ /dev/null @@ -1,20 +0,0 @@ -package com.tangem.tap.common.compose.extensions - -import androidx.compose.ui.graphics.Color -import androidx.compose.ui.graphics.toArgb -import androidx.core.graphics.alpha -import androidx.core.graphics.blue -import androidx.core.graphics.green -import androidx.core.graphics.red - -/** -[REDACTED_AUTHOR] - */ -fun Color.toAndroidGraphicsColor(): Int { - val argb = this.toArgb() - return android.graphics.Color.argb(argb.alpha, argb.red, argb.green, argb.blue) -} - -fun Color.parse(hexColor: String): Color { - return Color(hexColor.removePrefix("#").toInt(16)) -} \ No newline at end of file diff --git a/app/src/main/java/com/tangem/tap/common/compose/extensions/ImageBitmap.kt b/app/src/main/java/com/tangem/tap/common/compose/extensions/ImageBitmap.kt index 1692b4c51f..99911d9e6f 100644 --- a/app/src/main/java/com/tangem/tap/common/compose/extensions/ImageBitmap.kt +++ b/app/src/main/java/com/tangem/tap/common/compose/extensions/ImageBitmap.kt @@ -13,7 +13,8 @@ import androidx.core.graphics.drawable.toBitmap */ @Composable fun asImageBitmap(@DrawableRes drawableId: Int): ImageBitmap { - val drawable = AppCompatResources.getDrawable(LocalContext.current, drawableId) - ?: throw NullPointerException() + val drawable = requireNotNull(AppCompatResources.getDrawable(LocalContext.current, drawableId)) { + "drawable is null" + } return drawable.toBitmap().asImageBitmap() } \ No newline at end of file diff --git a/app/src/main/java/com/tangem/tap/common/extensions/BackupService.kt b/app/src/main/java/com/tangem/tap/common/extensions/BackupService.kt index abe1863c6d..140f0946b4 100644 --- a/app/src/main/java/com/tangem/tap/common/extensions/BackupService.kt +++ b/app/src/main/java/com/tangem/tap/common/extensions/BackupService.kt @@ -6,8 +6,7 @@ import com.tangem.operations.backup.BackupService /** [REDACTED_AUTHOR] */ +@Suppress("MagicNumber") fun BackupService.primaryCardIsSaltPayVisa(): Boolean { - return primaryCardId?.slice(0..3)?.let { - SaltPayWorkaround.isVisaBatchId(it) - } ?: false + return primaryCardId?.slice(0..3)?.let(SaltPayWorkaround::isVisaBatchId) ?: false } \ No newline at end of file diff --git a/app/src/main/java/com/tangem/tap/common/extensions/Bitmap.kt b/app/src/main/java/com/tangem/tap/common/extensions/Bitmap.kt index e8b3891ce9..80e756c21c 100644 --- a/app/src/main/java/com/tangem/tap/common/extensions/Bitmap.kt +++ b/app/src/main/java/com/tangem/tap/common/extensions/Bitmap.kt @@ -4,12 +4,14 @@ import android.graphics.Bitmap import android.graphics.BitmapFactory import java.io.ByteArrayOutputStream +@Suppress("MagicNumber") fun Bitmap.toByteArray(): ByteArray { val stream = ByteArrayOutputStream() this.compress(Bitmap.CompressFormat.JPEG, 20, stream) return stream.toByteArray() } +@Suppress("MagicNumber") fun ByteArray.toBitmap(): Bitmap { return BitmapFactory.decodeByteArray(this, 0, this.size) } \ No newline at end of file diff --git a/app/src/main/java/com/tangem/tap/common/extensions/Blockchain.kt b/app/src/main/java/com/tangem/tap/common/extensions/Blockchain.kt index 5e10f11f1d..133869ee22 100644 --- a/app/src/main/java/com/tangem/tap/common/extensions/Blockchain.kt +++ b/app/src/main/java/com/tangem/tap/common/extensions/Blockchain.kt @@ -5,16 +5,17 @@ import com.tangem.blockchain.common.Blockchain import com.tangem.common.extensions.remove import com.tangem.wallet.R +@Suppress("ComplexMethod") @DrawableRes fun Blockchain.getGreyedOutIconRes(): Int { return when (this) { Blockchain.Arbitrum, Blockchain.ArbitrumTestnet -> R.drawable.ic_arbitrum_no_color // Blockchain.Ducatus -> R.drawable.ic_ducatus - Blockchain.Bitcoin, Blockchain.BitcoinTestnet,-> R.drawable.ic_bitcoin_no_color + Blockchain.Bitcoin, Blockchain.BitcoinTestnet -> R.drawable.ic_bitcoin_no_color Blockchain.BitcoinCash -> R.drawable.ic_bitcoin_cash_no_color Blockchain.Litecoin -> R.drawable.ic_litecoin_no_color - Blockchain.Ethereum, Blockchain.EthereumTestnet, -> R.drawable.ic_eth_no_color - Blockchain.EthereumClassic, Blockchain.EthereumClassicTestnet, -> R.drawable.ic_eth_no_color + Blockchain.Ethereum, Blockchain.EthereumTestnet -> R.drawable.ic_eth_no_color + Blockchain.EthereumClassic, Blockchain.EthereumClassicTestnet -> R.drawable.ic_eth_no_color Blockchain.RSK -> R.drawable.ic_rsk_no_color Blockchain.Cardano, Blockchain.CardanoShelley -> R.drawable.ic_cardano_no_color Blockchain.Tezos -> R.drawable.ic_tezos_no_color @@ -24,7 +25,8 @@ fun Blockchain.getGreyedOutIconRes(): Int { Blockchain.Polygon, Blockchain.PolygonTestnet -> R.drawable.ic_polygon_no_color Blockchain.Solana, Blockchain.SolanaTestnet -> R.drawable.ic_solana_no_color Blockchain.Fantom, Blockchain.FantomTestnet -> R.drawable.ic_fantom_no_color - Blockchain.BSC, Blockchain.BSCTestnet, Blockchain.Binance, Blockchain.BinanceTestnet -> R.drawable.ic_bsc_no_color + Blockchain.BSC, Blockchain.BSCTestnet, Blockchain.Binance, Blockchain.BinanceTestnet -> + R.drawable.ic_bsc_no_color Blockchain.Dogecoin -> R.drawable.ic_dogecoin_no_color Blockchain.Tron, Blockchain.TronTestnet -> R.drawable.ic_tron_no_color Blockchain.Gnosis -> R.drawable.ic_gnosis_no_color @@ -49,4 +51,4 @@ fun Blockchain.getNetworkName(): String { } val Blockchain.fullNameWithoutTestnet -get() = this.fullName.remove(" Testnet") \ No newline at end of file + get() = this.fullName.remove(" Testnet") \ No newline at end of file diff --git a/app/src/main/java/com/tangem/tap/common/extensions/Navigation.kt b/app/src/main/java/com/tangem/tap/common/extensions/Navigation.kt index eaae03f471..6cb707b071 100644 --- a/app/src/main/java/com/tangem/tap/common/extensions/Navigation.kt +++ b/app/src/main/java/com/tangem/tap/common/extensions/Navigation.kt @@ -1,12 +1,10 @@ package com.tangem.tap.common.extensions import android.os.Bundle -import androidx.activity.OnBackPressedCallback import androidx.fragment.app.DialogFragment import androidx.fragment.app.Fragment import androidx.fragment.app.FragmentActivity import androidx.fragment.app.FragmentManager -import com.tangem.common.extensions.VoidCallback import com.tangem.feature.referral.ReferralFragment import com.tangem.feature.swap.presentation.SwapFragment import com.tangem.tap.common.redux.navigation.AppScreen @@ -84,21 +82,15 @@ fun FragmentActivity.getPreviousScreen(): AppScreen? { } else { 0 } - val tag = if (indexOfLastFragment < this.supportFragmentManager.backStackEntryCount) + val tag = if (indexOfLastFragment < this.supportFragmentManager.backStackEntryCount) { this.supportFragmentManager.getBackStackEntryAt(indexOfLastFragment).name - else null + } else { + null + } return tag?.let { AppScreen.valueOf(tag) } } -fun FragmentActivity.addOnBackPressedDispatcher( - isEnabled: Boolean = true, - onBackPressed: VoidCallback, -): OnBackPressedCallback = (object : OnBackPressedCallback(isEnabled) { - override fun handleOnBackPressed() { - onBackPressed() - } -}).also { this.onBackPressedDispatcher.addCallback(it) } - +@Suppress("ComplexMethod") private fun fragmentFactory(screen: AppScreen): Fragment { return when (screen) { AppScreen.Home -> HomeFragment() diff --git a/app/src/main/java/com/tangem/tap/common/extensions/Specific.kt b/app/src/main/java/com/tangem/tap/common/extensions/Specific.kt index 3f8e39c384..f3a7e1ca1c 100644 --- a/app/src/main/java/com/tangem/tap/common/extensions/Specific.kt +++ b/app/src/main/java/com/tangem/tap/common/extensions/Specific.kt @@ -13,7 +13,7 @@ import java.util.* //todo move extensions to utils fun BigDecimal.toFormattedString( - decimals: Int, roundingMode: RoundingMode = RoundingMode.DOWN, locale: Locale = Locale.US + decimals: Int, roundingMode: RoundingMode = RoundingMode.DOWN, locale: Locale = Locale.US, ): String { val symbols = DecimalFormatSymbols(locale) val df = DecimalFormat() @@ -25,9 +25,10 @@ fun BigDecimal.toFormattedString( return df.format(this) } +@Suppress("MagicNumber") fun BigDecimal.toFormattedCurrencyString( decimals: Int, currency: String, roundingMode: RoundingMode = RoundingMode.DOWN, - limitNumberOfDecimals: Boolean = true + limitNumberOfDecimals: Boolean = true, ): String { val decimalsForRounding = if (limitNumberOfDecimals) { if (decimals > 8) 8 else decimals @@ -35,13 +36,13 @@ fun BigDecimal.toFormattedCurrencyString( decimals } val formattedAmount = this.toFormattedString( - decimals = decimalsForRounding, roundingMode = roundingMode + decimals = decimalsForRounding, roundingMode = roundingMode, ) return "$formattedAmount $currency" } fun BigDecimal.toFiatRateString( - fiatCurrencyName: String + fiatCurrencyName: String, ): String { val value = this .setScale(2, RoundingMode.HALF_UP) @@ -52,7 +53,7 @@ fun BigDecimal.toFiatRateString( fun BigDecimal.toFiatString( rateValue: BigDecimal, fiatCurrencyName: String, - formatWithSpaces: Boolean = false + formatWithSpaces: Boolean = false, ): String { val fiatValue = rateValue.multiply(this) return fiatValue.toFormattedFiatValue(fiatCurrencyName, formatWithSpaces) @@ -65,7 +66,7 @@ fun BigDecimal.toFiatValue(rateValue: BigDecimal): BigDecimal { fun BigDecimal.toFormattedFiatValue( fiatCurrencyName: String, - formatWithSpaces: Boolean = false + formatWithSpaces: Boolean = false, ): String { val fiatValue = this.setScale(2, RoundingMode.HALF_UP) .let { if (formatWithSpaces) it.formatWithSpaces() else it } @@ -82,9 +83,7 @@ fun BigDecimal.scaleToFiat(applyPrecision: Boolean = false): BigDecimal { if (this.isZero()) return this val scaledFiat = this.setScale(2, RoundingMode.DOWN) - return if (scaledFiat.isZero() && applyPrecision) this.setPrecision(1) - else scaledFiat - + return if (scaledFiat.isZero() && applyPrecision) this.setPrecision(1) else scaledFiat } fun BigDecimal.setPrecision(precision: Int, roundingMode: RoundingMode = RoundingMode.DOWN): BigDecimal { @@ -109,7 +108,7 @@ fun BigDecimal.isLessThanOrEqual(value: BigDecimal): Boolean { fun BigDecimal.formatAmountAsSpannedString( currencySymbol: String, - reminderPartSizeProportion: Float = 0.7f + reminderPartSizeProportion: Float = 0.7f, ): SpannedString { val amount = this .setScale(2, RoundingMode.HALF_UP) @@ -125,11 +124,12 @@ fun BigDecimal.formatAmountAsSpannedString( append( "$reminder $currencySymbol", RelativeSizeSpan(reminderPartSizeProportion), - Spanned.SPAN_EXCLUSIVE_EXCLUSIVE + Spanned.SPAN_EXCLUSIVE_EXCLUSIVE, ) } } +@Suppress("MagicNumber") fun BigDecimal.formatWithSpaces(): String { val str = this.toString() var integerStr = str.substringBefore('.') diff --git a/app/src/main/java/com/tangem/tap/common/extensions/String.kt b/app/src/main/java/com/tangem/tap/common/extensions/String.kt index 021cc3a7f2..3c4125d422 100644 --- a/app/src/main/java/com/tangem/tap/common/extensions/String.kt +++ b/app/src/main/java/com/tangem/tap/common/extensions/String.kt @@ -29,7 +29,7 @@ fun String.colorSegment( context: Context, color: Int, startIndex: Int = 0, - endIndex: Int = this.length + endIndex: Int = this.length, ): Spannable { return this.toSpannable() .also { spannable -> @@ -37,11 +37,12 @@ fun String.colorSegment( ForegroundColorSpan(ContextCompat.getColor(context, color)), startIndex, endIndex, - Spannable.SPAN_EXCLUSIVE_EXCLUSIVE + Spannable.SPAN_EXCLUSIVE_EXCLUSIVE, ) } } +@Suppress("MagicNumber") fun String.toQrCode(): Bitmap { val hintMap = Hashtable() hintMap[EncodeHintType.ERROR_CORRECTION] = ErrorCorrectionLevel.M // H = 30% damage diff --git a/app/src/main/java/com/tangem/tap/common/extensions/TextView.kt b/app/src/main/java/com/tangem/tap/common/extensions/TextView.kt index 48ee67afc7..80daecc1d9 100644 --- a/app/src/main/java/com/tangem/tap/common/extensions/TextView.kt +++ b/app/src/main/java/com/tangem/tap/common/extensions/TextView.kt @@ -23,8 +23,7 @@ fun EditText.update(text: String?) { this.setText(text) if (!isFocused || textLength == 0) return - if (cursorPosition == 0) setSelection(textLength) - else setSelection(cursorPosition) + if (cursorPosition == 0) setSelection(textLength) else setSelection(cursorPosition) } fun EditText.setOnImeActionListener(action: Int, handler: (EditText) -> Unit) { @@ -56,13 +55,4 @@ fun TextInputLayout.enableError(enable: Boolean, errorMessage: String? = null) { error = null isErrorEnabled = false } -} - -fun TextView.isEllipsized(): Boolean { - val layout = this.layout - if (layout != null) { - val lines: Int = layout.lineCount - return (lines > 0) && (layout.getEllipsisCount(lines - 1) > 0) - } - return false } \ No newline at end of file diff --git a/app/src/main/java/com/tangem/tap/common/extensions/Token.kt b/app/src/main/java/com/tangem/tap/common/extensions/Token.kt index 59c918d736..7acbdfd9fb 100644 --- a/app/src/main/java/com/tangem/tap/common/extensions/Token.kt +++ b/app/src/main/java/com/tangem/tap/common/extensions/Token.kt @@ -6,19 +6,23 @@ import androidx.core.graphics.luminance import androidx.core.graphics.toColorInt import com.tangem.blockchain.common.Token +@Suppress("MagicNumber") @ColorInt fun Token.getColor(isTestnet: Boolean = false): Int { val defaultColor = "#C7C7CC".toColorInt() // equivalent to R.color.lightGray4 - return if (isTestnet) - defaultColor - else try { - ("#" + this.contractAddress.subSequence(2..7).toString()).toColorInt() - } catch (exception: Exception) { + return if (isTestnet) { defaultColor + } else { + try { + ("#" + this.contractAddress.subSequence(2..7).toString()).toColorInt() + } catch (exception: Exception) { + defaultColor + } } } +@Suppress("MagicNumber") @ColorInt fun Token.getTextColor(isTestnet: Boolean = false): Int = when { isTestnet -> Color.WHITE diff --git a/app/src/main/java/com/tangem/tap/common/extensions/UI.kt b/app/src/main/java/com/tangem/tap/common/extensions/UI.kt index 9e58542ecb..b7743af30d 100644 --- a/app/src/main/java/com/tangem/tap/common/extensions/UI.kt +++ b/app/src/main/java/com/tangem/tap/common/extensions/UI.kt @@ -1,16 +1,14 @@ +@file:Suppress("TooManyFunctions") + package com.tangem.tap.common.extensions import android.app.Activity -import android.content.ActivityNotFoundException import android.content.ClipData import android.content.ClipboardManager import android.content.Context import android.content.ContextWrapper import android.content.Intent -import android.content.res.Resources import android.graphics.drawable.Drawable -import android.os.Build -import android.os.Bundle import android.util.DisplayMetrics import android.util.TypedValue import android.view.View @@ -25,11 +23,6 @@ import androidx.core.content.ContextCompat import androidx.core.view.isVisible import androidx.fragment.app.Fragment import com.google.android.material.card.MaterialCardView -import com.tangem.common.extensions.VoidCallback - -fun Fragment.getDrawable(@DrawableRes drawableResId: Int): Drawable? { - return ContextCompat.getDrawable(requireContext(), drawableResId) -} fun Context.getDrawableCompat(@DrawableRes drawableResId: Int): Drawable? { return ContextCompat.getDrawable(this, drawableResId) @@ -62,17 +55,8 @@ fun View.getQuantityString(@PluralsRes id: Int, quantity: Int): String { return context.resources.getQuantityString(id, quantity, quantity) } -fun View.getResourceName(): String { - return try { - resources.getResourceEntryName(id) - } catch (ex: Resources.NotFoundException) { - "Not found" - } -} - fun View.show(show: Boolean, invokeBeforeStateChanged: (() -> Unit)? = null) { - return if (show) this.show(invokeBeforeStateChanged) - else this.hide(invokeBeforeStateChanged) + return if (show) this.show(invokeBeforeStateChanged) else this.hide(invokeBeforeStateChanged) } fun View.show(invokeBeforeStateChanged: (() -> Unit)? = null) { @@ -111,12 +95,6 @@ fun Context.pixelsToDp(pixels: Int): Int { .toInt() } -fun Context.dpToPixels(dp: Float): Float = - TypedValue.applyDimension(TypedValue.COMPLEX_UNIT_DIP, dp, this.resources.displayMetrics) - -fun Context.pixelsToDp(pixels: Float): Float = - (pixels / (resources.displayMetrics.densityDpi.toFloat() / DisplayMetrics.DENSITY_DEFAULT)) - tailrec fun Context?.getActivity(): Activity? = this as? Activity ?: (this as? ContextWrapper)?.baseContext?.getActivity() @@ -136,19 +114,6 @@ fun MaterialCardView.setMargins( this.layoutParams = params } -fun Activity.setSystemBarTextColor(setTextDark: Boolean) { - if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) { - val flags = this.window.decorView.systemUiVisibility - // Update the SystemUiVisibility dependening on whether we want a Light or Dark theme. - this.window.decorView.systemUiVisibility = - if (setTextDark) { - flags and View.SYSTEM_UI_FLAG_LIGHT_STATUS_BAR.inv() - } else { - flags or View.SYSTEM_UI_FLAG_LIGHT_STATUS_BAR - } - } -} - fun View.hideKeyboard() { val inputMethodManager = context.getSystemService(android.content.Context.INPUT_METHOD_SERVICE) as? InputMethodManager @@ -185,21 +150,6 @@ fun Fragment.shareText(text: String) { requireContext().shareText(text) } -fun Context.safeStartActivity( - intent: Intent, - options: Bundle? = null, - fallback: ((ActivityNotFoundException) -> Unit)? = null, - finally: VoidCallback? = null, -) { - try { - this.startActivity(intent, options) - } catch (ex: ActivityNotFoundException) { - fallback?.invoke(ex) - } finally { - finally?.invoke() - } -} - fun View.getString(resId: Int, vararg formatArgs: Any?): String { return context.getString(resId, *formatArgs) } diff --git a/app/src/main/java/com/tangem/tap/common/extensions/WalletManager.kt b/app/src/main/java/com/tangem/tap/common/extensions/WalletManager.kt index cda489f536..97997ba97f 100644 --- a/app/src/main/java/com/tangem/tap/common/extensions/WalletManager.kt +++ b/app/src/main/java/com/tangem/tap/common/extensions/WalletManager.kt @@ -21,6 +21,7 @@ import timber.log.Timber /** [REDACTED_AUTHOR] */ +@Suppress("MagicNumber") suspend fun WalletManager.safeUpdate(): Result = try { val scanResponse = store.state.globalState.scanResponse @@ -72,8 +73,7 @@ fun WalletManager?.getAddressData(): AddressData? { val wallet = this?.wallet ?: return null val addressDataList = wallet.createAddressesData() - return if (addressDataList.isEmpty()) null - else addressDataList[0] + return if (addressDataList.isEmpty()) null else addressDataList[0] } fun WalletManager.Companion.stub(): T { diff --git a/app/src/main/java/com/tangem/tap/common/feedback/AdditionalFeedbackInfo.kt b/app/src/main/java/com/tangem/tap/common/feedback/AdditionalFeedbackInfo.kt index 589597238f..c6f5bafd0a 100644 --- a/app/src/main/java/com/tangem/tap/common/feedback/AdditionalFeedbackInfo.kt +++ b/app/src/main/java/com/tangem/tap/common/feedback/AdditionalFeedbackInfo.kt @@ -48,6 +48,9 @@ class AdditionalFeedbackInfo { var fee: String = "" var token: String = "" + private val Address.name: String + get() = type.javaClass.simpleName + fun setCardInfo(data: ScanResponse) { cardId = data.card.cardId cardBlockchain = data.walletData?.blockchain ?: "" @@ -108,6 +111,7 @@ class AdditionalFeedbackInfo { } } + @Suppress("MagicNumber") private fun Wallet.formatAddressWith(with: String, mapAddress: (Address) -> String): String { return if (addresses.size == 1) { getExploreUrl(address) @@ -117,7 +121,4 @@ class AdditionalFeedbackInfo { .joinToString("\n") } } - - private val Address.name: String - get() = type.javaClass.simpleName } \ No newline at end of file diff --git a/app/src/main/java/com/tangem/tap/common/feedback/FeedbackData.kt b/app/src/main/java/com/tangem/tap/common/feedback/FeedbackData.kt index 8a426cccfc..452eb173aa 100644 --- a/app/src/main/java/com/tangem/tap/common/feedback/FeedbackData.kt +++ b/app/src/main/java/com/tangem/tap/common/feedback/FeedbackData.kt @@ -15,6 +15,7 @@ interface FeedbackData { fun createOptionalMessage(infoHolder: AdditionalFeedbackInfo): String + @Suppress("MagicNumber") fun joinTogether(context: Context, infoHolder: AdditionalFeedbackInfo): String { return StringBuilder().apply { append(context.getString(mainMessageResId)) @@ -42,6 +43,7 @@ class ScanFailsEmail : FeedbackData { override val subjectResId: Int = R.string.feedback_subject_scan_failed override val mainMessageResId: Int = R.string.feedback_preface_scan_failed + @Suppress("MagicNumber") override fun joinTogether(context: Context, infoHolder: AdditionalFeedbackInfo): String = StringBuilder().apply { append(context.getString(mainMessageResId)) breakLine(4) diff --git a/app/src/main/java/com/tangem/tap/common/leapfrogWidget/TestLeapfrogFragment.kt b/app/src/main/java/com/tangem/tap/common/leapfrogWidget/TestLeapfrogFragment.kt index 1999c35855..98a06327bb 100644 --- a/app/src/main/java/com/tangem/tap/common/leapfrogWidget/TestLeapfrogFragment.kt +++ b/app/src/main/java/com/tangem/tap/common/leapfrogWidget/TestLeapfrogFragment.kt @@ -17,13 +17,13 @@ class TestLeapfrogFragment : Fragment(R.layout.test_leapfrog_fragment) { private lateinit var twinsCardWidget: TwinsCardWidget private val binding: TestLeapfrogFragmentBinding by viewBinding(TestLeapfrogFragmentBinding::bind) - override fun onCreate(savedInstanceState: Bundle?) { super.onCreate(savedInstanceState) val inflater = TransitionInflater.from(requireContext()) exitTransition = inflater.inflateTransition(R.transition.fade) } + @Suppress("MagicNumber") override fun onViewCreated(view: View, savedInstanceState: Bundle?) { super.onViewCreated(view, savedInstanceState) diff --git a/app/src/main/java/com/tangem/tap/common/qrCodeScan/ScanQrCodeActivity.kt b/app/src/main/java/com/tangem/tap/common/qrCodeScan/ScanQrCodeActivity.kt index da69eed9ae..4a86caa20d 100644 --- a/app/src/main/java/com/tangem/tap/common/qrCodeScan/ScanQrCodeActivity.kt +++ b/app/src/main/java/com/tangem/tap/common/qrCodeScan/ScanQrCodeActivity.kt @@ -16,11 +16,6 @@ import me.dm7.barcodescanner.zxing.ZXingScannerView [REDACTED_AUTHOR] */ class ScanQrCodeActivity : AppCompatActivity(), ZXingScannerView.ResultHandler { - companion object { - val SCAN_QR_REQUEST_CODE = 1001 - val SCAN_RESULT = "scanResult" - } - private lateinit var mScannerView: ZXingScannerView override fun onCreate(state: Bundle?) { @@ -29,7 +24,6 @@ class ScanQrCodeActivity : AppCompatActivity(), ZXingScannerView.ResultHandler { setContentView(mScannerView) if (!permissionIsGranted()) requestPermission() - } override fun onResume() { @@ -66,4 +60,9 @@ class ScanQrCodeActivity : AppCompatActivity(), ZXingScannerView.ResultHandler { private fun requestPermission() { ActivityCompat.requestPermissions(this, arrayOf(Manifest.permission.CAMERA), PERMISSION_REQUEST_CODE) } + + companion object { + const val SCAN_QR_REQUEST_CODE = 1001 + const val SCAN_RESULT = "scanResult" + } } \ No newline at end of file diff --git a/app/src/main/java/com/tangem/tap/common/redux/FeatureRepositoryStore.kt b/app/src/main/java/com/tangem/tap/common/redux/FeatureRepositoryProvider.kt similarity index 100% rename from app/src/main/java/com/tangem/tap/common/redux/FeatureRepositoryStore.kt rename to app/src/main/java/com/tangem/tap/common/redux/FeatureRepositoryProvider.kt diff --git a/app/src/main/java/com/tangem/tap/common/redux/NotificationsMiddleware.kt b/app/src/main/java/com/tangem/tap/common/redux/NotificationsMiddleware.kt index a32545d675..4a7cb7b8f8 100644 --- a/app/src/main/java/com/tangem/tap/common/redux/NotificationsMiddleware.kt +++ b/app/src/main/java/com/tangem/tap/common/redux/NotificationsMiddleware.kt @@ -88,6 +88,7 @@ val notificationsMiddleware: Middleware = { dispatch, state -> } } +@Suppress("ComplexMethod") private fun handleNotificationAction(action: Action) { if (action is Debug && !BuildConfig.DEBUG) return diff --git a/app/src/main/java/com/tangem/tap/common/redux/global/GlobalMidlleware.kt b/app/src/main/java/com/tangem/tap/common/redux/global/GlobalMiddleware.kt similarity index 98% rename from app/src/main/java/com/tangem/tap/common/redux/global/GlobalMidlleware.kt rename to app/src/main/java/com/tangem/tap/common/redux/global/GlobalMiddleware.kt index 46ea27926e..c6c51659e2 100644 --- a/app/src/main/java/com/tangem/tap/common/redux/global/GlobalMidlleware.kt +++ b/app/src/main/java/com/tangem/tap/common/redux/global/GlobalMiddleware.kt @@ -30,10 +30,8 @@ import org.rekotlin.DispatchFunction import org.rekotlin.Middleware import java.util.* -class GlobalMiddleware { - companion object { - val handler = globalMiddlewareHandler - } +object GlobalMiddleware { + val handler = globalMiddlewareHandler } private val globalMiddlewareHandler: Middleware = { dispatch, appState -> @@ -45,6 +43,7 @@ private val globalMiddlewareHandler: Middleware = { dispatch, appState } } +@Suppress("LongMethod", "ComplexMethod") private fun handleAction(action: Action, appState: () -> AppState?, dispatch: DispatchFunction) { when (action) { is GlobalAction.ScanFailsCounter.ChooseBehavior -> { diff --git a/app/src/main/java/com/tangem/tap/common/redux/global/GlobalReducer.kt b/app/src/main/java/com/tangem/tap/common/redux/global/GlobalReducer.kt index 4dc8390a9c..07bf342432 100644 --- a/app/src/main/java/com/tangem/tap/common/redux/global/GlobalReducer.kt +++ b/app/src/main/java/com/tangem/tap/common/redux/global/GlobalReducer.kt @@ -9,6 +9,7 @@ import com.tangem.tap.preferencesStorage import com.tangem.tap.proxy.AppStateHolder import org.rekotlin.Action +@Suppress("LongMethod", "ComplexMethod") fun globalReducer(action: Action, state: AppState, appStateHolder: AppStateHolder): GlobalState { if (action !is GlobalAction) return state.globalState diff --git a/app/src/main/java/com/tangem/tap/common/redux/navigation/FragmentShareTransition.kt b/app/src/main/java/com/tangem/tap/common/redux/navigation/FragmentShareTransition.kt index 69547d020f..ab7aa07259 100644 --- a/app/src/main/java/com/tangem/tap/common/redux/navigation/FragmentShareTransition.kt +++ b/app/src/main/java/com/tangem/tap/common/redux/navigation/FragmentShareTransition.kt @@ -10,7 +10,7 @@ import java.lang.ref.WeakReference data class FragmentShareTransition( val shareElements: List, val enterTransitionSet: TransitionSet, - val exitTransitionSet: TransitionSet + val exitTransitionSet: TransitionSet, ) /** @@ -24,12 +24,12 @@ class ShareElement(view: View, name: String? = null) { init { name?.let { view.transitionName = it } elementName = view.transitionName - ?: throw UnsupportedOperationException("ShareElement require the name") + ?: throw UnsupportedOperationException("ShareElement require the name") wView = WeakReference(view) } companion object { - val imvFrontCard = "imv_front_card" - val imvBackCard = "imv_back_card" + const val imvFrontCard = "imv_front_card" + const val imvBackCard = "imv_back_card" } } \ No newline at end of file diff --git a/app/src/main/java/com/tangem/tap/common/redux/navigation/NavigationReducer.kt b/app/src/main/java/com/tangem/tap/common/redux/navigation/NavigationReducer.kt index b6f7522586..e338a7fb4c 100644 --- a/app/src/main/java/com/tangem/tap/common/redux/navigation/NavigationReducer.kt +++ b/app/src/main/java/com/tangem/tap/common/redux/navigation/NavigationReducer.kt @@ -4,10 +4,8 @@ import com.tangem.tap.common.extensions.getPreviousScreen import com.tangem.tap.common.redux.AppState import org.rekotlin.Action -class NavigationReducer { - companion object { - fun reduce(action: Action, state: AppState): NavigationState = internalReduce(action, state) - } +object NavigationReducer { + fun reduce(action: Action, state: AppState): NavigationState = internalReduce(action, state) } private fun internalReduce(action: Action, state: AppState): NavigationState { diff --git a/app/src/main/java/com/tangem/tap/common/shop/TangemShopService.kt b/app/src/main/java/com/tangem/tap/common/shop/TangemShopService.kt index 47951bfb84..fb010875c5 100644 --- a/app/src/main/java/com/tangem/tap/common/shop/TangemShopService.kt +++ b/app/src/main/java/com/tangem/tap/common/shop/TangemShopService.kt @@ -10,6 +10,7 @@ import com.tangem.tap.common.extensions.filterNotNull import com.tangem.tap.common.shop.data.ProductType import com.tangem.tap.common.shop.data.TangemProduct import com.tangem.tap.common.shop.data.TotalSum +import com.tangem.tap.common.shop.googlepay.GooglePayService import com.tangem.tap.common.shop.shopify.ShopifyService import com.tangem.tap.common.shop.shopify.ShopifyShop import com.tangem.tap.common.shop.shopify.data.CheckoutItem diff --git a/app/src/main/java/com/tangem/tap/common/shop/googlepay/GooglePayService.kt b/app/src/main/java/com/tangem/tap/common/shop/googlepay/GooglePayService.kt index 13c3913ebe..37201242d9 100644 --- a/app/src/main/java/com/tangem/tap/common/shop/googlepay/GooglePayService.kt +++ b/app/src/main/java/com/tangem/tap/common/shop/googlepay/GooglePayService.kt @@ -1,4 +1,4 @@ -package com.tangem.tap.common.shop +package com.tangem.tap.common.shop.googlepay import android.app.Activity import android.app.Activity.RESULT_CANCELED @@ -6,9 +6,12 @@ import android.app.Activity.RESULT_OK import android.content.Intent import android.util.Log import com.google.android.gms.common.api.ApiException -import com.google.android.gms.wallet.* +import com.google.android.gms.wallet.AutoResolveHelper +import com.google.android.gms.wallet.IsReadyToPayRequest +import com.google.android.gms.wallet.PaymentData +import com.google.android.gms.wallet.PaymentDataRequest +import com.google.android.gms.wallet.PaymentsClient import com.tangem.common.core.TangemSdkError -import com.tangem.tap.common.shop.googlepay.GooglePayUtil import kotlinx.coroutines.Dispatchers import kotlinx.coroutines.withContext import org.json.JSONException @@ -48,7 +51,7 @@ class GooglePayService(private val paymentsClient: PaymentsClient, private val a totalPriceCents, currencyCode = currencyCode, countryCode = "RU", - merchantID = merchantID + merchantID = merchantID, ) if (paymentDataRequestJson == null) { Timber.e("RequestPayment: can't fetch payment data request") @@ -57,7 +60,7 @@ class GooglePayService(private val paymentsClient: PaymentsClient, private val a val request = PaymentDataRequest.fromJson(paymentDataRequestJson.toString()) AutoResolveHelper.resolveTask( - paymentsClient.loadPaymentData(request), activity, LOAD_PAYMENT_DATA_REQUEST_CODE + paymentsClient.loadPaymentData(request), activity, LOAD_PAYMENT_DATA_REQUEST_CODE, ) } @@ -81,7 +84,6 @@ class GooglePayService(private val paymentsClient: PaymentsClient, private val a } else { Result.failure(Exception("$statusCode")) } - } else -> Result.failure(Exception("Unknown Status")) } @@ -117,7 +119,6 @@ class GooglePayService(private val paymentsClient: PaymentsClient, private val a .getString("token") return GooglePayResponse(address, token) - } catch (e: JSONException) { Log.e("handlePaymentSuccess", "Error: " + e.toString()) } @@ -144,5 +145,5 @@ data class Address( val address3: String, val locality: String, val administrativeArea: String, - val sortingCode: String + val sortingCode: String, ) \ No newline at end of file diff --git a/app/src/main/java/com/tangem/tap/common/shop/googlepay/GooglePayUtil.kt b/app/src/main/java/com/tangem/tap/common/shop/googlepay/GooglePayUtil.kt index 610ab10c9d..c27680eef3 100644 --- a/app/src/main/java/com/tangem/tap/common/shop/googlepay/GooglePayUtil.kt +++ b/app/src/main/java/com/tangem/tap/common/shop/googlepay/GooglePayUtil.kt @@ -14,20 +14,7 @@ object GooglePayUtil { put("apiVersionMinor", 0) } - private fun gatewayTokenizationSpecification(merchantID: String): JSONObject { - return JSONObject().apply { - put("type", "PAYMENT_GATEWAY") - put( - "parameters", JSONObject( - mapOf( - "gateway" to "shopify", - "gatewayMerchantId" to merchantID - ) - ) - ) - } - } - + @Suppress("MagicNumber") private val allowedCardNetworks = JSONArray( listOf( "AMEX", @@ -35,17 +22,34 @@ object GooglePayUtil { "INTERAC", "JCB", "MASTERCARD", - "VISA" - ) + "VISA", + ), ) private val allowedCardAuthMethods = JSONArray( listOf( "PAN_ONLY", - "CRYPTOGRAM_3DS" - ) + "CRYPTOGRAM_3DS", + ), ) + private val merchantInfo: JSONObject = JSONObject().put("merchantName", "Example Merchant") + + private fun gatewayTokenizationSpecification(merchantID: String): JSONObject { + return JSONObject().apply { + put("type", "PAYMENT_GATEWAY") + put( + "parameters", + JSONObject( + mapOf( + "gateway" to "shopify", + "gatewayMerchantId" to merchantID, + ), + ), + ) + } + } + private fun baseCardPaymentMethod(): JSONObject { return JSONObject().apply { @@ -53,9 +57,12 @@ object GooglePayUtil { put("allowedAuthMethods", allowedCardAuthMethods) put("allowedCardNetworks", allowedCardNetworks) put("billingAddressRequired", true) - put("billingAddressParameters", JSONObject().apply { - put("format", "FULL") - }) + put( + "billingAddressParameters", + JSONObject().apply { + put("format", "FULL") + }, + ) } put("type", "CARD") @@ -83,7 +90,6 @@ object GooglePayUtil { baseRequest.apply { put("allowedPaymentMethods", JSONArray().put(baseCardPaymentMethod())) } - } catch (e: JSONException) { null } @@ -92,7 +98,7 @@ object GooglePayUtil { private fun getTransactionInfo( price: String, countryCode: String, - currencyCode: String + currencyCode: String, ): JSONObject { return JSONObject().apply { put("totalPrice", price) @@ -102,15 +108,11 @@ object GooglePayUtil { } } - private val merchantInfo: JSONObject = - JSONObject().put("merchantName", "Example Merchant") - - fun getPaymentDataRequest( price: String, countryCode: String, currencyCode: String, - merchantID: String + merchantID: String, ): JSONObject? { try { return baseRequest.apply { @@ -133,5 +135,4 @@ object GooglePayUtil { } } - const val PAYMENTS_ENVIRONMENT = WalletConstants.ENVIRONMENT_TEST \ No newline at end of file diff --git a/app/src/main/java/com/tangem/tap/common/shop/shopify/ShopifyService.kt b/app/src/main/java/com/tangem/tap/common/shop/shopify/ShopifyService.kt index a33fb82b84..4998c89da9 100644 --- a/app/src/main/java/com/tangem/tap/common/shop/shopify/ShopifyService.kt +++ b/app/src/main/java/com/tangem/tap/common/shop/shopify/ShopifyService.kt @@ -16,11 +16,10 @@ import java.util.concurrent.TimeUnit import kotlin.coroutines.resume import kotlin.coroutines.suspendCoroutine - +@Suppress("LargeClass") class ShopifyService(private val application: Application, val shop: ShopifyShop) { val client: GraphClient by lazy { initClient() } - suspend fun getShopName(): Result { val query = query { rootQuery: QueryRootQuery -> rootQuery @@ -40,16 +39,15 @@ class ShopifyService(private val application: Application, val shop: ShopifyShop } } + @Suppress("MagicNumber") suspend fun getProducts(collectionTitleFilter: String? = null): Result> { val filter = collectionTitleFilter?.let { "title:\"$it\"" } val query = query { rootQuery: QueryRootQuery -> - rootQuery - .collections( - { arg -> arg.first(250).query(filter) }, - ) { collectionConnectionQuery -> - collectionConnectionQuery.collectionFieldsFragment() - } + rootQuery.collections( + { arg -> arg.first(250).query(filter) }, + CollectionConnectionQuery::collectionFieldsFragment, + ) } return when (val result = queryAsync(query)) { is GraphCallResult.Success -> { @@ -78,7 +76,7 @@ class ShopifyService(private val application: Application, val shop: ShopifyShop } } val retryHandler = RetryHandler.build( - 1, TimeUnit.SECONDS + 1, TimeUnit.SECONDS, ) { this.retryWhen { result -> when (result) { @@ -100,7 +98,6 @@ class ShopifyService(private val application: Application, val shop: ShopifyShop } else { Result.failure(ShopifyError.Unknown) } - } is GraphCallResult.Failure -> { Result.failure(result.error) @@ -110,10 +107,9 @@ class ShopifyService(private val application: Application, val shop: ShopifyShop suspend fun createCheckout( checkoutItems: List, - checkoutID: ID? = null + checkoutID: ID? = null, ): Result { - val storefrontLineItems: MutableList = checkoutItems .map { CheckoutLineItemInput(it.quantity, it.id) }.toMutableList() @@ -121,13 +117,13 @@ class ShopifyService(private val application: Application, val shop: ShopifyShop mutation { mutationQuery: MutationQuery -> mutationQuery .checkoutLineItemsReplace( - storefrontLineItems, checkoutID + storefrontLineItems, checkoutID, ) { payloadQuery: CheckoutLineItemsReplacePayloadQuery -> payloadQuery .checkout { checkoutQuery: CheckoutQuery -> checkoutQuery.checkoutFieldsFragment() } - .userErrors() { userErrorQuery: CheckoutUserErrorQuery -> + .userErrors { userErrorQuery: CheckoutUserErrorQuery -> userErrorQuery .field() .message() @@ -137,18 +133,18 @@ class ShopifyService(private val application: Application, val shop: ShopifyShop } else { val input = CheckoutCreateInput() .setLineItemsInput( - Input.value(storefrontLineItems) + Input.value(storefrontLineItems), ) mutation { mutationQuery: MutationQuery -> mutationQuery .checkoutCreate( - input + input, ) { payloadQuery: CheckoutCreatePayloadQuery -> payloadQuery .checkout { checkoutQuery: CheckoutQuery -> checkoutQuery.checkoutFieldsFragment() } - .checkoutUserErrors() { userErrorQuery: CheckoutUserErrorQuery -> + .checkoutUserErrors { userErrorQuery: CheckoutUserErrorQuery -> userErrorQuery .field() .message() @@ -163,13 +159,13 @@ class ShopifyService(private val application: Application, val shop: ShopifyShop val query = mutation { mutationQuery: MutationQuery -> mutationQuery .checkoutDiscountCodeApplyV2( - discountCode, checkoutID + discountCode, checkoutID, ) { payloadQuery: CheckoutDiscountCodeApplyV2PayloadQuery -> payloadQuery .checkout { checkoutQuery: CheckoutQuery -> checkoutQuery.checkoutFieldsFragment() } - .checkoutUserErrors() { userErrorQuery: CheckoutUserErrorQuery -> + .checkoutUserErrors { userErrorQuery: CheckoutUserErrorQuery -> userErrorQuery .field() .message() @@ -183,44 +179,9 @@ class ShopifyService(private val application: Application, val shop: ShopifyShop val query = mutation { mutationQuery: MutationQuery -> mutationQuery .checkoutDiscountCodeRemove( - checkoutID + checkoutID, ) { payloadQuery: CheckoutDiscountCodeRemovePayloadQuery -> payloadQuery - .checkout { checkoutQuery: CheckoutQuery -> - checkoutQuery.checkoutFieldsFragment() - } - .checkoutUserErrors() { userErrorQuery: CheckoutUserErrorQuery -> - userErrorQuery - .field() - .message() - } - } - } - return runCheckoutMutation(query) - } - - suspend fun updateAddress( - address: MailingAddress, - checkoutID: ID, - waitForShippingRates: Boolean - ): Result { - val input = MailingAddressInput() - .setAddress1(address.address1) - .setAddress2(address.address2) - .setCity(address.city) - .setCountry(address.country) - .setFirstName(address.firstName) - .setLastName(address.lastName) - .setPhone(address.phone) - .setProvince(address.province) - .setZip(address.zip) - - val query = mutation { mutationQuery: MutationQuery -> - mutationQuery - .checkoutShippingAddressUpdateV2( - input, checkoutID - ) { shippingAddressUpdatePayloadQuery: CheckoutShippingAddressUpdateV2PayloadQuery -> - shippingAddressUpdatePayloadQuery .checkout { checkoutQuery: CheckoutQuery -> checkoutQuery.checkoutFieldsFragment() } @@ -231,59 +192,18 @@ class ShopifyService(private val application: Application, val shop: ShopifyShop } } } - - return runCheckoutMutation(query) - } - - suspend fun updateEmail(email: String?, checkoutID: ID): Result { - val query = mutation { mutationQuery: MutationQuery -> - mutationQuery - .checkoutEmailUpdateV2( - checkoutID, email - ) { emailUpdatePayloadQuery: CheckoutEmailUpdateV2PayloadQuery -> - emailUpdatePayloadQuery - .checkout { checkoutQuery: CheckoutQuery -> - checkoutQuery.checkoutFieldsFragment() - } - .checkoutUserErrors() { userErrorQuery: CheckoutUserErrorQuery -> - userErrorQuery - .field() - .message() - } - } - } - return runCheckoutMutation(query) - } - - suspend fun updateShippingRate(handle: String?, checkoutID: ID): Result { - val query = mutation { mutationQuery: MutationQuery -> - mutationQuery - .checkoutShippingLineUpdate( - checkoutID, handle - ) { shippingLineUpdatePayloadQuery: CheckoutShippingLineUpdatePayloadQuery -> - shippingLineUpdatePayloadQuery - .checkout { checkoutQuery: CheckoutQuery -> - checkoutQuery.checkoutFieldsFragment() - } - .checkoutUserErrors() { userErrorQuery: CheckoutUserErrorQuery -> - userErrorQuery - .field() - .message() - } - } - } return runCheckoutMutation(query) } suspend fun completeWithTokenizedPayment( payment: TokenizedPaymentInputV3, - checkoutID: ID + checkoutID: ID, ): Result { val query = mutation { mutationQuery: MutationQuery -> mutationQuery .checkoutCompleteWithTokenizedPaymentV3( - checkoutID, payment + checkoutID, payment, ) { payloadQuery: CheckoutCompleteWithTokenizedPaymentV3PayloadQuery -> payloadQuery .payment { paymentQuery: PaymentQuery -> @@ -295,7 +215,7 @@ class ShopifyService(private val application: Application, val shop: ShopifyShop checkoutQuery .ready() } - .checkoutUserErrors() { userErrorQuery: CheckoutUserErrorQuery -> + .checkoutUserErrors { userErrorQuery: CheckoutUserErrorQuery -> userErrorQuery .field() .message() @@ -305,10 +225,6 @@ class ShopifyService(private val application: Application, val shop: ShopifyShop return runCheckoutMutation(query) } - fun startGooglePaySession() { -// PaySession() - } - private suspend fun runCheckoutMutation(mutation: MutationQuery): Result { return when (val result = mutationQueryAsync(mutation)) { is GraphCallResult.Success -> { @@ -322,13 +238,13 @@ class ShopifyService(private val application: Application, val shop: ShopifyShop Result.success(checkout) } - is GraphCallResult.Failure -> Result.failure(result.error) + is GraphCallResult.Failure -> Result.failure(result.error) } } private suspend fun queryAsync( query: QueryRootQuery, - retryHandler: RetryHandler + retryHandler: RetryHandler, ): GraphCallResult = withContext(Dispatchers.IO) { suspendCoroutine { continuation -> @@ -358,12 +274,11 @@ class ShopifyService(private val application: Application, val shop: ShopifyShop } } - private fun initClient(): GraphClient { return GraphClient.build( application, shop.domain, - shop.storefrontApiKey + shop.storefrontApiKey, ) { // httpCache(application.filesDir) { // cacheMaxSizeBytes = (1024 * 1024 * 10) @@ -371,13 +286,9 @@ class ShopifyService(private val application: Application, val shop: ShopifyShop // HttpCachePolicy.Default.CACHE_FIRST.expireAfter(20, TimeUnit.MINUTES) // } } - } } - sealed class ShopifyError : Throwable() { object Unknown : ShopifyError() - object GooglePayFailed : ShopifyError() - class UserError(val errorMessage: String) } \ No newline at end of file diff --git a/app/src/main/java/com/tangem/tap/common/shop/shopify/data/Checkout.kt b/app/src/main/java/com/tangem/tap/common/shop/shopify/data/Checkout.kt index 849c1f33c3..7565db2447 100644 --- a/app/src/main/java/com/tangem/tap/common/shop/shopify/data/Checkout.kt +++ b/app/src/main/java/com/tangem/tap/common/shop/shopify/data/Checkout.kt @@ -2,23 +2,24 @@ package com.tangem.tap.common.shop.shopify.data import com.shopify.buy3.Storefront +@Suppress("LongMethod", "MagicNumber") fun Storefront.CheckoutQuery.checkoutFieldsFragment() { - // id() ready() webUrl() currencyCode() lineItemsSubtotalPrice { it.amount() } totalPriceV2 { it.currencyCode() - it.amount() } + it.amount() + } lineItems({ arg -> arg.first(250) }) { it.edges { it.node { // it.id() it.title() it.quantity() - it.variant() { - it.priceV2() { it.amount() } + it.variant { + it.priceV2 { it.amount() } } } } diff --git a/app/src/main/java/com/tangem/tap/common/shop/shopify/data/Collection.kt b/app/src/main/java/com/tangem/tap/common/shop/shopify/data/Collection.kt index 572a7b68c7..1527fc9558 100644 --- a/app/src/main/java/com/tangem/tap/common/shop/shopify/data/Collection.kt +++ b/app/src/main/java/com/tangem/tap/common/shop/shopify/data/Collection.kt @@ -2,13 +2,15 @@ package com.tangem.tap.common.shop.shopify.data import com.shopify.buy3.Storefront +@Suppress("MagicNumber") fun Storefront.CollectionConnectionQuery.collectionFieldsFragment() { edges { collectionEdgeQuery -> collectionEdgeQuery .node { collectionQuery -> collectionQuery .title() - .products({ arg -> arg.first(250) } + .products( + { arg -> arg.first(250) }, ) { productConnectionQuery -> productConnectionQuery .edges { productEdgeQuery -> diff --git a/app/src/main/java/com/tangem/tap/common/text/DecimalDigitsInputFilter.kt b/app/src/main/java/com/tangem/tap/common/text/DecimalDigitsInputFilter.kt index 689095c534..067bcfb5df 100644 --- a/app/src/main/java/com/tangem/tap/common/text/DecimalDigitsInputFilter.kt +++ b/app/src/main/java/com/tangem/tap/common/text/DecimalDigitsInputFilter.kt @@ -8,13 +8,22 @@ import java.util.regex.Pattern [REDACTED_AUTHOR] */ class DecimalDigitsInputFilter( - digitsBeforeDecimal: Int, - digitsAfterDecimal: Int, - private val decimalSeparator: String + digitsBeforeDecimal: Int, + digitsAfterDecimal: Int, + private val decimalSeparator: String, ) : InputFilter { - private val pattern: Pattern = Pattern.compile("(([1-9]{1}[0-9]{0,${digitsBeforeDecimal - 1}})?||[0]{1})((\\$decimalSeparator[0-9]{0,$digitsAfterDecimal})?)||(\\$decimalSeparator)?") + @Suppress("MaxLineLength") + private val pattern: Pattern = + Pattern.compile("(([1-9]{1}[0-9]{0,${digitsBeforeDecimal - 1}})?||[0]{1})((\\$decimalSeparator[0-9]{0,$digitsAfterDecimal})?)||(\\$decimalSeparator)?") - override fun filter(source: CharSequence, sourceStart: Int, sourceEnd: Int, destination: Spanned, destinationStart: Int, destinationEnd: Int): CharSequence? { + override fun filter( + source: CharSequence, + sourceStart: Int, + sourceEnd: Int, + destination: Spanned, + destinationStart: Int, + destinationEnd: Int, + ): CharSequence? { val destString = destination.toString() val prefix = destString.substring(0, destinationStart) val suffix = destString.substring(destinationEnd, destString.length) diff --git a/app/src/main/java/com/tangem/tap/common/toggleWidget/RefreshBalanceWidget.kt b/app/src/main/java/com/tangem/tap/common/toggleWidget/RefreshBalanceWidget.kt index ca3bb64dbf..101c40a0d2 100644 --- a/app/src/main/java/com/tangem/tap/common/toggleWidget/RefreshBalanceWidget.kt +++ b/app/src/main/java/com/tangem/tap/common/toggleWidget/RefreshBalanceWidget.kt @@ -17,6 +17,7 @@ import com.tangem.wallet.R /** [REDACTED_AUTHOR] */ +@Suppress("MagicNumber") class RefreshBalanceWidget( private val root: ViewGroup, ) : ViewStateWidget { @@ -57,6 +58,7 @@ class RefreshBalanceWidget( viewSwitcher.showNext() } + @Suppress("MagicNumber") private fun animateState(state: ProgressState) { when (state) { ProgressState.Done, ProgressState.Error -> { @@ -94,6 +96,7 @@ class RefreshBalanceWidget( private fun getState(): ProgressState = if (isArrowRefreshActive()) ProgressState.Done else ProgressState.Loading } +@Suppress("MagicNumber") class ShowAnimation : AnimationSet(true) { init { addAnimation( diff --git a/app/src/main/java/com/tangem/tap/common/toggleWidget/ViewStateWidget.kt b/app/src/main/java/com/tangem/tap/common/toggleWidget/ViewStateWidget.kt index 48ba0a7291..10b6a1f7a6 100644 --- a/app/src/main/java/com/tangem/tap/common/toggleWidget/ViewStateWidget.kt +++ b/app/src/main/java/com/tangem/tap/common/toggleWidget/ViewStateWidget.kt @@ -2,7 +2,6 @@ package com.tangem.tap.common.toggleWidget import android.view.View - /** [REDACTED_AUTHOR] */ diff --git a/app/src/main/java/com/tangem/tap/common/ui/SimpleAlertDialog.kt b/app/src/main/java/com/tangem/tap/common/ui/SimpleAlertDialog.kt index 8cd6e7e5ba..0eaa8e2bf2 100644 --- a/app/src/main/java/com/tangem/tap/common/ui/SimpleAlertDialog.kt +++ b/app/src/main/java/com/tangem/tap/common/ui/SimpleAlertDialog.kt @@ -6,54 +6,50 @@ import com.tangem.tap.common.redux.global.GlobalAction import com.tangem.tap.store import com.tangem.wallet.R -class SimpleAlertDialog { - companion object { - fun create( - titleRes: Int? = null, - messageRes: Int? = null, - title: String? = null, - message: String? = null, - primaryButtonRes: Int = R.string.common_ok, - context: Context, - ): AlertDialog { - return SimpleCancelableAlertDialog.create( - titleRes = titleRes, - messageRes = messageRes, - title = title, - message = message, - primaryButtonRes = primaryButtonRes, - secondaryButtonRes = null, - context = context - ) - } +object SimpleAlertDialog { + fun create( + titleRes: Int? = null, + messageRes: Int? = null, + title: String? = null, + message: String? = null, + primaryButtonRes: Int = R.string.common_ok, + context: Context, + ): AlertDialog { + return SimpleCancelableAlertDialog.create( + titleRes = titleRes, + messageRes = messageRes, + title = title, + message = message, + primaryButtonRes = primaryButtonRes, + secondaryButtonRes = null, + context = context, + ) } } -class SimpleCancelableAlertDialog { - companion object { - fun create( - titleRes: Int? = null, - messageRes: Int? = null, - title: String? = null, - message: String? = null, - primaryButtonRes: Int = R.string.common_ok, - secondaryButtonRes: Int? = R.string.common_cancel, - primaryButtonAction: () -> Unit = {}, - secondaryButtonAction: () -> Unit = {}, - context: Context, - ): AlertDialog { +object SimpleCancelableAlertDialog { + fun create( + titleRes: Int? = null, + messageRes: Int? = null, + title: String? = null, + message: String? = null, + primaryButtonRes: Int = R.string.common_ok, + secondaryButtonRes: Int? = R.string.common_cancel, + primaryButtonAction: () -> Unit = {}, + secondaryButtonAction: () -> Unit = {}, + context: Context, + ): AlertDialog { - return AlertDialog.Builder(context).apply { - setTitle(titleRes?.let { context.getString(it) } ?: title ) - setMessage(messageRes?.let { context.getString(it) } ?: message) - setPositiveButton(context.getText(primaryButtonRes)) { _, _ -> primaryButtonAction() } - if (secondaryButtonRes != null) { - setNegativeButton(context.getText(secondaryButtonRes)) { _, _ -> secondaryButtonAction()} - } - setOnDismissListener { - store.dispatch(GlobalAction.HideDialog) - } - }.create() - } + return AlertDialog.Builder(context).apply { + setTitle(titleRes?.let { context.getString(it) } ?: title) + setMessage(messageRes?.let { context.getString(it) } ?: message) + setPositiveButton(context.getText(primaryButtonRes)) { _, _ -> primaryButtonAction() } + if (secondaryButtonRes != null) { + setNegativeButton(context.getText(secondaryButtonRes)) { _, _ -> secondaryButtonAction() } + } + setOnDismissListener { + store.dispatch(GlobalAction.HideDialog) + } + }.create() } } \ No newline at end of file diff --git a/app/src/main/java/com/tangem/tap/domain/PayIdManager.kt b/app/src/main/java/com/tangem/tap/domain/PayIdManager.kt index cfd5c2b5c2..f99f01f923 100644 --- a/app/src/main/java/com/tangem/tap/domain/PayIdManager.kt +++ b/app/src/main/java/com/tangem/tap/domain/PayIdManager.kt @@ -10,7 +10,11 @@ import java.util.* class PayIdManager { - suspend fun verifyPayId(payId: String, blockchain: Blockchain): Result = withContext(Dispatchers.IO) { + @Suppress("MagicNumber") + suspend fun verifyPayId( + payId: String, + blockchain: Blockchain, + ): Result = withContext(Dispatchers.IO) { val splitPayId = payId.split("\$") val user = splitPayId[0] val baseUrl = "https://${splitPayId[1]}/" @@ -19,28 +23,30 @@ class PayIdManager { private fun Blockchain.getPayIdNetwork(): String { return when (this) { - Blockchain.XRP -> "XRPL" - Blockchain.RSK -> "RSK" - else -> this.currency - }.toLowerCase() + Blockchain.XRP -> "XRPL" + Blockchain.RSK -> "RSK" + else -> this.currency + }.lowercase(Locale.getDefault()) } companion object { - val payIdRegExp = "^[a-z0-9!#@%&*+/=?^_`{|}~-]+(?:\\.[a-z0-9!#@%&*+/=?^_`{|}~-]+)*\\\$(?:(?:[a-z0-9](?:[a-z0-9-]*[a-z0-9])?\\.)+[a-z0-9](?:[a-z-]*[a-z0-9])?|(?:[0-9]{1,3}\\.){3}[0-9]{1,3})\$".toRegex() + @Suppress("MaxLineLength") + val payIdRegExp = + "^[a-z0-9!#@%&*+/=?^_`{|}~-]+(?:\\.[a-z0-9!#@%&*+/=?^_`{|}~-]+)*\\\$(?:(?:[a-z0-9](?:[a-z0-9-]*[a-z0-9])?\\.)+[a-z0-9](?:[a-z-]*[a-z0-9])?|(?:[0-9]{1,3}\\.){3}[0-9]{1,3})\$".toRegex() val payIdSupported: EnumSet = EnumSet.of( - Blockchain.XRP, - Blockchain.Ethereum, - Blockchain.Bitcoin, - Blockchain.Litecoin, - Blockchain.Stellar, - Blockchain.Cardano, - Blockchain.CardanoShelley, - Blockchain.Ducatus, - Blockchain.BitcoinCash, - Blockchain.Binance, - Blockchain.RSK, - Blockchain.Tezos + Blockchain.XRP, + Blockchain.Ethereum, + Blockchain.Bitcoin, + Blockchain.Litecoin, + Blockchain.Stellar, + Blockchain.Cardano, + Blockchain.CardanoShelley, + Blockchain.Ducatus, + Blockchain.BitcoinCash, + Blockchain.Binance, + Blockchain.RSK, + Blockchain.Tezos, ) fun isPayId(value: String?): Boolean = value?.contains(payIdRegExp) ?: false diff --git a/app/src/main/java/com/tangem/tap/domain/RatesRepository.kt b/app/src/main/java/com/tangem/tap/domain/RatesRepository.kt index 10c14744b2..3d2a5764e2 100644 --- a/app/src/main/java/com/tangem/tap/domain/RatesRepository.kt +++ b/app/src/main/java/com/tangem/tap/domain/RatesRepository.kt @@ -42,7 +42,7 @@ class RatesRepository( } .onFailure { Result.Failure(it) } - throw IllegalStateException("Unreachable code because runCatching must return result") + error("Unreachable code because runCatching must return result") } private fun handleFiatRatesResult(rates: Map?>): Result.Success { diff --git a/app/src/main/java/com/tangem/tap/domain/TangemSdkManager.kt b/app/src/main/java/com/tangem/tap/domain/TangemSdkManager.kt index cf8a13681c..09a23afbf3 100644 --- a/app/src/main/java/com/tangem/tap/domain/TangemSdkManager.kt +++ b/app/src/main/java/com/tangem/tap/domain/TangemSdkManager.kt @@ -21,6 +21,7 @@ import com.tangem.common.extensions.ByteArrayKey import com.tangem.common.hdWallet.DerivationPath import com.tangem.common.map import com.tangem.common.usersCode.UserCodeRepository +import com.tangem.core.analytics.Analytics import com.tangem.domain.common.CardDTO import com.tangem.domain.common.ScanResponse import com.tangem.operations.CommandResponse @@ -30,7 +31,6 @@ import com.tangem.operations.derivation.DeriveMultipleWalletPublicKeysTask import com.tangem.operations.pins.CheckUserCodesCommand import com.tangem.operations.pins.CheckUserCodesResponse import com.tangem.operations.pins.SetUserCodeCommand -import com.tangem.core.analytics.Analytics import com.tangem.tap.common.analytics.events.Basic import com.tangem.tap.domain.tasks.CreateWalletAndRescanTask import com.tangem.tap.domain.tasks.product.CreateProductWalletTask @@ -211,6 +211,7 @@ class TangemSdkManager(private val tangemSdk: TangemSdk, private val context: Co return withContext(Dispatchers.Main) { result } } + @Suppress("MagicNumber") fun changeDisplayedCardIdNumbersCount(scanResponse: ScanResponse?) { tangemSdk.config.cardIdDisplayFormat = when { scanResponse == null -> CardIdDisplayFormat.Full diff --git a/app/src/main/java/com/tangem/tap/domain/TapErrors.kt b/app/src/main/java/com/tangem/tap/domain/TapErrors.kt index 72d70b4bb1..b0ee231286 100644 --- a/app/src/main/java/com/tangem/tap/domain/TapErrors.kt +++ b/app/src/main/java/com/tangem/tap/domain/TapErrors.kt @@ -17,21 +17,20 @@ interface MultiMessageError : TapErrors { sealed class TapError( @StringRes val messageResource: Int, - override val args: List? = null + override val args: List? = null, ) : Throwable(), TapErrors, ArgError { object UnknownError : TapError(R.string.send_error_unknown) open class CustomError(val customMessage: String) : TapError(R.string.common_custom_string, listOf(customMessage)) object ScanCardError : TapError(R.string.scan_card_error) - object PayIdAlreadyCreated : TapError(R.string.wallet_create_payid_error_already_created) - object PayIdCreatingError : TapError(R.string.wallet_create_payid_error_message) - object PayIdEmptyField : TapError(R.string.wallet_create_payid_empty) object UnknownBlockchain : TapError(R.string.wallet_error_unsupported_blockchain_subtitle) object NoInternetConnection : TapError(R.string.wallet_notification_no_internet) - object InsufficientBalance : TapError(R.string.send_error_insufficient_balance) object BlockchainInternalError : TapError(R.string.send_error_blockchain_internal) object AmountExceedsBalance : TapError(R.string.send_validation_amount_exceeds_balance) - data class AmountLowerExistentialDeposit(override val args: List) : TapError(R.string.send_error_minimum_balance_format) + data class AmountLowerExistentialDeposit( + override val args: List, + ) : TapError(R.string.send_error_minimum_balance_format) + object FeeExceedsBalance : TapError(R.string.send_validation_invalid_fee) object TotalExceedsBalance : TapError(R.string.send_validation_invalid_total) object InvalidAmountValue : TapError(R.string.send_validation_invalid_amount) @@ -48,7 +47,6 @@ sealed class TapError( object CreationError : CustomError("Can't create wallet manager") class NoAccountError(amountToCreateAccount: String) : CustomError(amountToCreateAccount) class InternalError(message: String) : CustomError(message) - object BlockchainIsUnreachable : TapError(R.string.wallet_balance_blockchain_unreachable) object BlockchainIsUnreachableTryLater : TapError(R.string.wallet_balance_blockchain_unreachable_try_later) } diff --git a/app/src/main/java/com/tangem/tap/domain/configurable/config/ConfigManager.kt b/app/src/main/java/com/tangem/tap/domain/configurable/config/ConfigManager.kt index 989d16359e..d6d05ac254 100644 --- a/app/src/main/java/com/tangem/tap/domain/configurable/config/ConfigManager.kt +++ b/app/src/main/java/com/tangem/tap/domain/configurable/config/ConfigManager.kt @@ -77,6 +77,7 @@ class ConfigManager { ) } + @Suppress("LongMethod") private fun setupKey(configValues: ConfigValueModel?) { val values = configValues ?: return config = config.copy( diff --git a/app/src/main/java/com/tangem/tap/domain/configurable/config/ConfigLoaders.kt b/app/src/main/java/com/tangem/tap/domain/configurable/config/FeaturesLocalLoader.kt similarity index 100% rename from app/src/main/java/com/tangem/tap/domain/configurable/config/ConfigLoaders.kt rename to app/src/main/java/com/tangem/tap/domain/configurable/config/FeaturesLocalLoader.kt diff --git a/app/src/main/java/com/tangem/tap/domain/configurable/config/JsonModels.kt b/app/src/main/java/com/tangem/tap/domain/configurable/config/JsonModels.kt index 77a1f0d6cc..586ba0c63b 100644 --- a/app/src/main/java/com/tangem/tap/domain/configurable/config/JsonModels.kt +++ b/app/src/main/java/com/tangem/tap/domain/configurable/config/JsonModels.kt @@ -15,6 +15,7 @@ class FeatureModel( val isCreatingTwinCardsAllowed: Boolean, ) +@Suppress("LongParameterList") class ConfigValueModel( val coinMarketCapKey: String, val mercuryoWidgetId: String, diff --git a/app/src/main/java/com/tangem/tap/domain/configurable/warningMessage/WarningMessagesManager.kt b/app/src/main/java/com/tangem/tap/domain/configurable/warningMessage/WarningMessagesManager.kt index f75a4922ce..93b80c5ca4 100644 --- a/app/src/main/java/com/tangem/tap/domain/configurable/warningMessage/WarningMessagesManager.kt +++ b/app/src/main/java/com/tangem/tap/domain/configurable/warningMessage/WarningMessagesManager.kt @@ -70,6 +70,8 @@ class WarningMessagesManager { } companion object { + const val REMAINING_SIGNATURES_WARNING = 10 + fun devCardWarning(): WarningMessage = WarningMessage( "", "", @@ -171,7 +173,5 @@ class WarningMessagesManager { R.string.alert_demo_message, WarningMessage.Origin.Local, ) - - const val REMAINING_SIGNATURES_WARNING = 10 } } \ No newline at end of file diff --git a/app/src/main/java/com/tangem/tap/domain/extensions/Blockchain.kt b/app/src/main/java/com/tangem/tap/domain/extensions/Blockchain.kt index 673ef1787b..9adb6b24aa 100644 --- a/app/src/main/java/com/tangem/tap/domain/extensions/Blockchain.kt +++ b/app/src/main/java/com/tangem/tap/domain/extensions/Blockchain.kt @@ -5,7 +5,7 @@ import com.tangem.blockchain.common.Token import com.tangem.common.card.EllipticCurve import java.math.BigDecimal - +@Suppress("MagicNumber") fun Blockchain.amountToCreateAccount(token: Token? = null): BigDecimal? { return when (this) { Blockchain.Stellar -> if (token?.symbol == NODL) BigDecimal(1.5) else BigDecimal.ONE diff --git a/app/src/main/java/com/tangem/tap/domain/extensions/Card.kt b/app/src/main/java/com/tangem/tap/domain/extensions/Card.kt index 486a9f6b89..b321c5f5c3 100644 --- a/app/src/main/java/com/tangem/tap/domain/extensions/Card.kt +++ b/app/src/main/java/com/tangem/tap/domain/extensions/Card.kt @@ -37,6 +37,7 @@ val CardDTO.isTangemWallet: Boolean && firmwareVersion >= FirmwareVersion.MultiWalletAvailable && !isSaltPay +@Suppress("UnnecessaryParentheses") fun CardDTO.hasSignedHashes(): Boolean { return wallets.any { (it.totalSignedHashes ?: 0) > 0 } } diff --git a/app/src/main/java/com/tangem/tap/domain/extensions/WalletManagerFactory.kt b/app/src/main/java/com/tangem/tap/domain/extensions/WalletManagerFactory.kt index cfa69de062..a41280542c 100644 --- a/app/src/main/java/com/tangem/tap/domain/extensions/WalletManagerFactory.kt +++ b/app/src/main/java/com/tangem/tap/domain/extensions/WalletManagerFactory.kt @@ -45,7 +45,7 @@ fun WalletManagerFactory.makeWalletManagerForApp( curve = wallet.curve, ) } - scanResponse.card.isHdWalletAllowedByApp && (seedKey != null && derivationParams != null) -> { + scanResponse.card.isHdWalletAllowedByApp && seedKey != null && derivationParams != null -> { val derivedKeys = scanResponse.derivedKeys[wallet.publicKey.toMapKey()] val derivationPath = when (derivationParams) { is DerivationParams.Default -> blockchain.derivationPath(derivationParams.style) @@ -143,12 +143,13 @@ fun WalletManagerFactory.makeSaltPayWalletManager( scanResponse: ScanResponse, ): EthereumWalletManager { val blockchain = scanResponse.getBlockchain() - if (blockchain != Blockchain.SaltPay) - throw IllegalArgumentException("WalletManager for the SaltPay can be created based only on Blockchain.SaltPay") + if (blockchain != Blockchain.SaltPay) { + error("WalletManager for the SaltPay can be created based only on Blockchain.SaltPay") + } val token = SaltPayWorkaround.tokenFrom(blockchain) val cardWallet = scanResponse.card.wallets.firstOrNull().guard { - throw NullPointerException("SaltPay card must have one wallet at least") + error("SaltPay card must have one wallet at least") } return makeWalletManager( diff --git a/app/src/main/java/com/tangem/tap/domain/model/builders/WalletStoreBuilder.kt b/app/src/main/java/com/tangem/tap/domain/model/builders/WalletStoreBuilder.kt index e76a291668..ada8c6896e 100644 --- a/app/src/main/java/com/tangem/tap/domain/model/builders/WalletStoreBuilder.kt +++ b/app/src/main/java/com/tangem/tap/domain/model/builders/WalletStoreBuilder.kt @@ -57,7 +57,7 @@ private class BlockchainNetworkWalletStoreBuilderImpl( userWalletId = userWalletId, blockchain = blockchainNetwork.blockchain, derivationPath = blockchainNetwork.derivationPath?.let { DerivationPath(it) }, - walletsData = (listOf(blockchainWalletData) + tokensWalletsData), + walletsData = listOf(blockchainWalletData) + tokensWalletsData, walletRent = null, walletManager = walletManager, blockchainNetwork = blockchainNetwork, @@ -79,7 +79,7 @@ private class WalletMangerWalletStoreBuilderImpl( userWalletId = userWalletId, blockchain = wallet.blockchain, derivationPath = wallet.publicKey.derivationPath, - walletsData = (listOf(blockchainWalletData) + listOfNotNull(tokenWalletsData)), + walletsData = listOf(blockchainWalletData) + listOfNotNull(tokenWalletsData), walletRent = null, walletManager = walletManager, blockchainNetwork = BlockchainNetwork.fromWalletManager(walletManager), diff --git a/app/src/main/java/com/tangem/tap/domain/moduleMessage/domain/converter/AddCustomTokenErrorConverter.kt b/app/src/main/java/com/tangem/tap/domain/moduleMessage/domain/converter/AddCustomTokenErrorConverter.kt index 66e41dc48e..daa0901b14 100644 --- a/app/src/main/java/com/tangem/tap/domain/moduleMessage/domain/converter/AddCustomTokenErrorConverter.kt +++ b/app/src/main/java/com/tangem/tap/domain/moduleMessage/domain/converter/AddCustomTokenErrorConverter.kt @@ -15,8 +15,9 @@ internal class AddCustomTokenErrorConverter( private val context: Context, ) : ModuleMessageConverter { + @Suppress("MagicNumber") override fun convert(message: DomainModuleError): ConvertedMessage? { - val customTokenError = (message as? AddCustomTokenError) ?: throw UnsupportedOperationException() + val customTokenError = message as? AddCustomTokenError ?: throw UnsupportedOperationException() val rawMessage = when (customTokenError) { AddCustomTokenError.Warning.PotentialScamToken -> R.string.custom_token_validation_error_not_found diff --git a/app/src/main/java/com/tangem/tap/domain/moduleMessage/saltPay/converter/SaltPayActivationErrorConverter.kt b/app/src/main/java/com/tangem/tap/domain/moduleMessage/saltPay/converter/SaltPayActivationErrorConverter.kt index 65de384d44..1771a2db47 100644 --- a/app/src/main/java/com/tangem/tap/domain/moduleMessage/saltPay/converter/SaltPayActivationErrorConverter.kt +++ b/app/src/main/java/com/tangem/tap/domain/moduleMessage/saltPay/converter/SaltPayActivationErrorConverter.kt @@ -14,7 +14,7 @@ internal class SaltPayActivationErrorConverter( ) : ModuleMessageConverter { override fun convert(message: SaltPayActivationError): ConvertedDialogMessage? { - val saltPayError = (message as? SaltPayActivationError) ?: throw UnsupportedOperationException() + val saltPayError = message as? SaltPayActivationError ?: throw UnsupportedOperationException() val dialogMessage = when (saltPayError) { SaltPayActivationError.NoGas -> { diff --git a/app/src/main/java/com/tangem/tap/domain/scanCard/ScanCardProcessor.kt b/app/src/main/java/com/tangem/tap/domain/scanCard/ScanCardProcessor.kt index 7b33c2f9fc..60cfd3b5f9 100644 --- a/app/src/main/java/com/tangem/tap/domain/scanCard/ScanCardProcessor.kt +++ b/app/src/main/java/com/tangem/tap/domain/scanCard/ScanCardProcessor.kt @@ -6,12 +6,12 @@ import com.tangem.common.core.TangemSdkError import com.tangem.common.doOnFailure import com.tangem.common.doOnSuccess import com.tangem.common.services.Result +import com.tangem.core.analytics.Analytics import com.tangem.domain.common.ScanResponse import com.tangem.domain.common.extensions.withMainContext import com.tangem.operations.backup.BackupService import com.tangem.tap.DELAY_SDK_DIALOG_CLOSE import com.tangem.tap.backupService -import com.tangem.core.analytics.Analytics import com.tangem.tap.common.analytics.events.IntroductionProcess import com.tangem.tap.common.analytics.paramsInterceptor.BatchIdParamsInterceptor import com.tangem.tap.common.extensions.dispatchDialogShow @@ -141,31 +141,34 @@ object ScanCardProcessor { store.dispatchOnMain(DisclaimerAction.SetDisclaimer(disclaimer)) if (disclaimer.isAccepted()) { - nextHandler((scanResponse)) - } else scope.launch { - delay(DELAY_SDK_DIALOG_CLOSE) - disclaimerWillShow() - dispatchOnMain( - DisclaimerAction.Show( - fromScreen = AppScreen.Home, - callback = DisclaimerCallback( - onAccept = { - scope.launch(Dispatchers.Main) { - nextHandler(scanResponse) - } - }, - onDismiss = { - scope.launch(Dispatchers.Main) { - onProgressStateChange(false) - onFailure(TangemSdkError.UserCancelled()) - } - }, + nextHandler(scanResponse) + } else { + scope.launch { + delay(DELAY_SDK_DIALOG_CLOSE) + disclaimerWillShow() + dispatchOnMain( + DisclaimerAction.Show( + fromScreen = AppScreen.Home, + callback = DisclaimerCallback( + onAccept = { + scope.launch(Dispatchers.Main) { + nextHandler(scanResponse) + } + }, + onDismiss = { + scope.launch(Dispatchers.Main) { + onProgressStateChange(false) + onFailure(TangemSdkError.UserCancelled()) + } + }, + ), ), - ), - ) + ) + } } } + @Suppress("LongMethod", "MagicNumber") private suspend inline fun onScanSuccess( scanResponse: ScanResponse, crossinline onProgressStateChange: suspend (showProgress: Boolean) -> Unit, diff --git a/app/src/main/java/com/tangem/tap/domain/statePrinter/OnboardingWalletStateConverter.kt b/app/src/main/java/com/tangem/tap/domain/statePrinter/OnboardingWalletStateConverter.kt index 858dc8b5d1..baccb34947 100644 --- a/app/src/main/java/com/tangem/tap/domain/statePrinter/OnboardingWalletStateConverter.kt +++ b/app/src/main/java/com/tangem/tap/domain/statePrinter/OnboardingWalletStateConverter.kt @@ -56,6 +56,7 @@ class BackupStepAdapter { } } + @Suppress("MagicNumber") @FromJson fun fromJson(json: String): BackupStep { return when (json) { diff --git a/app/src/main/java/com/tangem/tap/domain/tasks/DerivationTask.kt b/app/src/main/java/com/tangem/tap/domain/tasks/DerivationTask.kt deleted file mode 100644 index 3c471f4bc4..0000000000 --- a/app/src/main/java/com/tangem/tap/domain/tasks/DerivationTask.kt +++ /dev/null @@ -1,55 +0,0 @@ -//package com.tangem.tap.domain.tasks -// -//import com.tangem.common.CompletionResult -//import com.tangem.common.core.CardSession -//import com.tangem.common.core.CardSessionRunnable -//import com.tangem.common.core.CompletionCallback -//import com.tangem.common.hdWallet.DerivationPath -//import com.tangem.common.hdWallet.ExtendedPublicKey -//import com.tangem.operations.CommandResponse -//import com.tangem.operations.derivation.DeriveWalletPublicKeysTask -//import com.tangem.tap.common.extensions.ByteArrayKey -// -//class ExtendedPublicKeyList( -// items: Collection -//): ArrayList(items), CommandResponse -// -// -//class DerivationTaskResponse( -// val entries: Map -//): CommandResponse -// -//class DerivationTask( -// private val derivations: Map> -//) : CardSessionRunnable { -// -// val response: MutableMap = mutableMapOf() -// -// override fun run(session: CardSession, callback: CompletionCallback) { -// derive(keys = derivations.keys.toList(), index = 0, session = session, callback = callback) -// } -// -// private fun derive( -// keys: List, -// index: Int, -// session: CardSession, -// callback: CompletionCallback -// ) { -// if (index == keys.count()) { -// callback(CompletionResult.Success(DerivationTaskResponse(response.toMap()))) -// return -// } -// -// val key = keys[index] -// val paths = derivations[key]!! -// DeriveWalletPublicKeysTask(key.bytes, paths).run(session) { result -> -// when (result) { -// is CompletionResult.Success -> { -// response[key] = result.data[key] -// derive(keys = keys, index = index + 1, session = session, callback = callback) -// } -// is CompletionResult.Failure -> callback(CompletionResult.Failure(result.error)) -// } -// } -// } -//} \ No newline at end of file diff --git a/app/src/main/java/com/tangem/tap/domain/tasks/product/ResetToFactorySettingsTask.kt b/app/src/main/java/com/tangem/tap/domain/tasks/product/ResetToFactorySettingsTask.kt index 444a7b3971..bc11f4be74 100644 --- a/app/src/main/java/com/tangem/tap/domain/tasks/product/ResetToFactorySettingsTask.kt +++ b/app/src/main/java/com/tangem/tap/domain/tasks/product/ResetToFactorySettingsTask.kt @@ -8,7 +8,7 @@ import com.tangem.common.extensions.guard import com.tangem.operations.backup.ResetBackupCommand import com.tangem.operations.wallet.PurgeWalletCommand -class ResetToFactorySettingsTask() : CardSessionRunnable { +class ResetToFactorySettingsTask : CardSessionRunnable { override fun run(session: CardSession, callback: (result: CompletionResult) -> Unit) { deleteWallets(session, callback) diff --git a/app/src/main/java/com/tangem/tap/domain/tasks/product/ScanProductTask.kt b/app/src/main/java/com/tangem/tap/domain/tasks/product/ScanProductTask.kt index b04226d1d6..080659c97b 100644 --- a/app/src/main/java/com/tangem/tap/domain/tasks/product/ScanProductTask.kt +++ b/app/src/main/java/com/tangem/tap/domain/tasks/product/ScanProductTask.kt @@ -170,7 +170,8 @@ private class ScanWalletProcessor( ) { val activationInProgress = preferencesStorage.usedCardsPrefStorage.isActivationInProgress(card.cardId) - if ((card.backupStatus == CardDTO.BackupStatus.NoBackup && card.wallets.isNotEmpty()) + @Suppress("ComplexCondition") + if (card.backupStatus == CardDTO.BackupStatus.NoBackup && card.wallets.isNotEmpty() && (activationInProgress || card.isSaltPay) ) { StartPrimaryCardLinkingTask().run(session) { linkingResult -> @@ -266,7 +267,7 @@ private class ScanWalletProcessor( } if (additionalBlockchainsToDerive != null) { blockchainsToDerive.addAll( - additionalBlockchainsToDerive.map { BlockchainNetwork(it, card) } + additionalBlockchainsToDerive.map { BlockchainNetwork(it, card) }, ) } if (!card.useOldStyleDerivation) { @@ -307,6 +308,7 @@ private class ScanWalletProcessor( } } +@Suppress("MagicNumber") private class ScanTwinProcessor : ProductCommandProcessor { override fun proceed( card: CardDTO, diff --git a/app/src/main/java/com/tangem/tap/domain/tokens/LoadAvailableCoinsService.kt b/app/src/main/java/com/tangem/tap/domain/tokens/LoadAvailableCoinsService.kt index 179d3a22ea..90a720055c 100644 --- a/app/src/main/java/com/tangem/tap/domain/tokens/LoadAvailableCoinsService.kt +++ b/app/src/main/java/com/tangem/tap/domain/tokens/LoadAvailableCoinsService.kt @@ -43,7 +43,7 @@ class LoadAvailableCoinsService( LoadedCoins( currencies = data.coins.map { Currency.fromCoinResponse(it, data.imageHost) }, moreAvailable = data.total > offset + LOAD_PER_PAGE, - ) + ), ) } is Result.Failure -> { @@ -70,7 +70,7 @@ class LoadAvailableCoinsService( .onSuccess { return@withContext Result.Success(it) } .onFailure { return@withContext Result.Failure(it) } - throw IllegalStateException("Unreachable code because runCatching must return result") + error("Unreachable code because runCatching must return result") } } diff --git a/app/src/main/java/com/tangem/tap/domain/tokens/OldUserTokensRepository.kt b/app/src/main/java/com/tangem/tap/domain/tokens/OldUserTokensRepository.kt index 96d98f91a5..a4706680b7 100644 --- a/app/src/main/java/com/tangem/tap/domain/tokens/OldUserTokensRepository.kt +++ b/app/src/main/java/com/tangem/tap/domain/tokens/OldUserTokensRepository.kt @@ -119,7 +119,7 @@ class OldUserTokensRepository( .onSuccess { return@map it.coins.firstOrNull()?.id } .onFailure { return@map null } - throw IllegalStateException("Unreachable code because runCatching must return result") + error("Unreachable code because runCatching must return result") } .mapIndexedNotNull { index, id -> if (id == null) null else tokens[index].contractAddress to id diff --git a/app/src/main/java/com/tangem/tap/domain/tokens/UserTokensRepository.kt b/app/src/main/java/com/tangem/tap/domain/tokens/UserTokensRepository.kt index b8b585e1ee..7d01846702 100644 --- a/app/src/main/java/com/tangem/tap/domain/tokens/UserTokensRepository.kt +++ b/app/src/main/java/com/tangem/tap/domain/tokens/UserTokensRepository.kt @@ -49,7 +49,7 @@ class UserTokensRepository( return@withContext handleGetUserTokensFailure(card = card, userId = userId, error = it) } - throw IllegalStateException("Unreachable code because runCatching must return result") + error("Unreachable code because runCatching must return result") } // TODO("After adding DI") replace with CoroutineDispatcherProvider diff --git a/app/src/main/java/com/tangem/tap/domain/tokens/models/BlockchainDao.kt b/app/src/main/java/com/tangem/tap/domain/tokens/models/BlockchainDao.kt index 73eef228ad..4417004531 100644 --- a/app/src/main/java/com/tangem/tap/domain/tokens/models/BlockchainDao.kt +++ b/app/src/main/java/com/tangem/tap/domain/tokens/models/BlockchainDao.kt @@ -10,14 +10,13 @@ data class BlockchainDao( @Json(name = "key") val name: String, @Json(name = "testnet") - val isTestNet: Boolean + val isTestNet: Boolean, ) { @Deprecated("The method is used only for migration from older versions of the app") fun toBlockchain(): Blockchain { val blockchain = Blockchain.values().find { it.name.lowercase() == name.lowercase() } - ?: throw Exception("Invalid BlockchainDao") - return if (!isTestNet) blockchain else blockchain.getTestnetVersion() - ?: throw Exception("Invalid BlockchainDao") + ?: error("Blockchain is null") + return if (!isTestNet) blockchain else blockchain.getTestnetVersion() ?: error("Invalid BlockchainDao") } companion object { diff --git a/app/src/main/java/com/tangem/tap/domain/tokens/models/BlockchainNetwork.kt b/app/src/main/java/com/tangem/tap/domain/tokens/models/BlockchainNetwork.kt index 3b9558c303..0be009ce5a 100644 --- a/app/src/main/java/com/tangem/tap/domain/tokens/models/BlockchainNetwork.kt +++ b/app/src/main/java/com/tangem/tap/domain/tokens/models/BlockchainNetwork.kt @@ -12,15 +12,16 @@ import com.tangem.domain.common.TapWorkarounds.derivationStyle data class BlockchainNetwork( val blockchain: Blockchain, val derivationPath: String?, - val tokens: List + val tokens: List, ) { - constructor( - blockchain: Blockchain, - card: CardDTO, - ) : this( + constructor(blockchain: Blockchain, card: CardDTO) : this( blockchain = blockchain, - derivationPath = if (card.settings.isHDWalletAllowed) blockchain.derivationPath(card.derivationStyle)?.rawPath else null, + derivationPath = if (card.settings.isHDWalletAllowed) { + blockchain.derivationPath(card.derivationStyle)?.rawPath + } else { + null + }, tokens = emptyList(), ) @@ -43,7 +44,7 @@ data class BlockchainNetwork( } override fun hashCode(): Int = calculateHashCode( - blockchain.hashCode(), derivationPath?.hashCode() ?: 0 + blockchain.hashCode(), derivationPath?.hashCode() ?: 0, ) companion object { @@ -51,7 +52,7 @@ data class BlockchainNetwork( return BlockchainNetwork( walletManager.wallet.blockchain, walletManager.wallet.publicKey.derivationPath?.rawPath, - walletManager.cardTokens.toList() + walletManager.cardTokens.toList(), ) } } diff --git a/app/src/main/java/com/tangem/tap/domain/twins/TwinCardsWidget.kt b/app/src/main/java/com/tangem/tap/domain/twins/TwinCardsWidget.kt index 36d3b037ff..95d1d76fdd 100644 --- a/app/src/main/java/com/tangem/tap/domain/twins/TwinCardsWidget.kt +++ b/app/src/main/java/com/tangem/tap/domain/twins/TwinCardsWidget.kt @@ -11,14 +11,13 @@ import com.tangem.tangem_sdk_new.ui.widget.leapfrogWidget.LeapView import com.tangem.tangem_sdk_new.ui.widget.leapfrogWidget.LeapViewState import com.tangem.tangem_sdk_new.ui.widget.leapfrogWidget.LeapfrogWidget - /** [REDACTED_AUTHOR] */ class TwinsCardWidget( val leapfrogWidget: LeapfrogWidget, private val deviceScaleFactor: Float = 1f, - val getTopOfAnchorViewForActivateState: () -> Float + val getTopOfAnchorViewForActivateState: () -> Float, ) { var state: TwinCardsWidgetState? = null @@ -37,7 +36,7 @@ class TwinsCardWidget( val animator = createAnimator(animate) animator.playTogether( createAnimator(TwinCardNumber.First, createWelcomeProperties(TwinCardNumber.First)), - createAnimator(TwinCardNumber.Second, createWelcomeProperties(TwinCardNumber.Second)) + createAnimator(TwinCardNumber.Second, createWelcomeProperties(TwinCardNumber.Second)), ) animator.doOnEnd { onEnd() } leapfrogWidget.fold(animate) { animator.start() } @@ -50,7 +49,7 @@ class TwinsCardWidget( val animator = createAnimator(animate) animator.playTogether( createAnimator(TwinCardNumber.First, createLeapfrogProperties(TwinCardNumber.First)), - createAnimator(TwinCardNumber.Second, createLeapfrogProperties(TwinCardNumber.Second)) + createAnimator(TwinCardNumber.Second, createLeapfrogProperties(TwinCardNumber.Second)), ) animator.doOnEnd { leapfrogWidget.initViews() @@ -66,7 +65,7 @@ class TwinsCardWidget( val animator = createAnimator(animate) animator.playTogether( createAnimator(TwinCardNumber.First, createActivateProperties(TwinCardNumber.First)), - createAnimator(TwinCardNumber.Second, createActivateProperties(TwinCardNumber.Second)) + createAnimator(TwinCardNumber.Second, createActivateProperties(TwinCardNumber.Second)), ) animator.doOnEnd { onEnd() } animator.start() @@ -85,6 +84,7 @@ class TwinsCardWidget( return animator } + @Suppress("MagicNumber") private fun createWelcomeProperties(cardNumber: TwinCardNumber): TwinsCardProperties { return when (cardNumber) { TwinCardNumber.First -> { @@ -118,6 +118,7 @@ class TwinsCardWidget( ) } + @Suppress("MagicNumber") private fun createActivateProperties(cardNumber: TwinCardNumber): TwinsCardProperties { val topOfAnchorView = getTopOfAnchorViewForActivateState() val twinProperties = TwinsCardProperties.from(getLeapViewByCardNumber(cardNumber).state) diff --git a/app/src/main/java/com/tangem/tap/domain/twins/WriteProtectedIssuerDataTask.kt b/app/src/main/java/com/tangem/tap/domain/twins/WriteProtectedIssuerDataTask.kt index 31d35c4a06..4b86581b80 100644 --- a/app/src/main/java/com/tangem/tap/domain/twins/WriteProtectedIssuerDataTask.kt +++ b/app/src/main/java/com/tangem/tap/domain/twins/WriteProtectedIssuerDataTask.kt @@ -34,11 +34,14 @@ class WriteProtectedIssuerDataTask( is CompletionResult.Success -> { writeIssuerData( twinPublicKey, issuerKeys, signResult.data.signature, - readResult.data, session, callback + readResult.data, session, callback, ) } - is CompletionResult.Failure -> callback(CompletionResult.Failure( - readResult.error)) + is CompletionResult.Failure -> callback( + CompletionResult.Failure( + readResult.error, + ), + ) } } } @@ -47,6 +50,7 @@ class WriteProtectedIssuerDataTask( } } + @Suppress("LongParameterList") private fun writeIssuerData( twinPublicKey: ByteArray, issuerKeys: KeyPair, cardSignature: ByteArray, readResponse: ReadIssuerDataResponse, diff --git a/app/src/main/java/com/tangem/tap/domain/userWalletList/UserWalletsListManager.kt b/app/src/main/java/com/tangem/tap/domain/userWalletList/UserWalletsListManager.kt index 9e7619e7c5..fd85a066ba 100644 --- a/app/src/main/java/com/tangem/tap/domain/userWalletList/UserWalletsListManager.kt +++ b/app/src/main/java/com/tangem/tap/domain/userWalletList/UserWalletsListManager.kt @@ -21,10 +21,10 @@ interface UserWalletsListManager { /** * Save provided user wallet and set it as selected * @param userWallet [UserWallet] to save - * @param canOverride If false, then terminate with [UserWalletListError.WalletAlreadySaved] when user tries to save an - * already saved card + * @param canOverride If false, then terminate with [UserWalletListError.WalletAlreadySaved] when user tries + * to save an already saved card * @return [CompletionResult] of operation - * */ + */ suspend fun save(userWallet: UserWallet, canOverride: Boolean = false): CompletionResult /** diff --git a/app/src/main/java/com/tangem/tap/domain/userWalletList/implementation/BiometricUserWalletsListManager.kt b/app/src/main/java/com/tangem/tap/domain/userWalletList/implementation/BiometricUserWalletsListManager.kt index db1db2ebbd..3f8cdb5221 100644 --- a/app/src/main/java/com/tangem/tap/domain/userWalletList/implementation/BiometricUserWalletsListManager.kt +++ b/app/src/main/java/com/tangem/tap/domain/userWalletList/implementation/BiometricUserWalletsListManager.kt @@ -219,13 +219,18 @@ internal class BiometricUserWalletsListManager( private suspend fun loadModels(): CompletionResult { return getSavedUserWallets() .map { userWallets -> - if (userWallets.isNotEmpty()) state.update { prevState -> - val wallets = (userWallets + prevState.userWallets).distinctBy { it.walletId } + if (userWallets.isNotEmpty()) { + state.update { prevState -> + val wallets = (userWallets + prevState.userWallets).distinctBy { it.walletId } - prevState.copy( - userWallets = wallets, - selectedUserWalletId = findOrSetSelectedUserWalletId(prevState.selectedUserWalletId, wallets), - ) + prevState.copy( + userWallets = wallets, + selectedUserWalletId = findOrSetSelectedUserWalletId( + prevSelectedWalletId = prevState.selectedUserWalletId, + userWallets = wallets, + ), + ) + } } } .doOnFailure { error -> diff --git a/app/src/main/java/com/tangem/tap/domain/userWalletList/repository/implementation/BiometricUserWalletsKeysRepository.kt b/app/src/main/java/com/tangem/tap/domain/userWalletList/repository/implementation/BiometricUserWalletsKeysRepository.kt index 11e558535d..5f72d40ab7 100644 --- a/app/src/main/java/com/tangem/tap/domain/userWalletList/repository/implementation/BiometricUserWalletsKeysRepository.kt +++ b/app/src/main/java/com/tangem/tap/domain/userWalletList/repository/implementation/BiometricUserWalletsKeysRepository.kt @@ -134,7 +134,7 @@ internal class BiometricUserWalletsKeysRepository( } private suspend fun deleteUserWalletsIds(userWalletsIds: List) { - val remainingIds = (getUserWalletsIds() - userWalletsIds.toSet()) + val remainingIds = getUserWalletsIds() - userWalletsIds.toSet() withContext(Dispatchers.IO) { secureStorage.store(remainingIds.encode(), StorageKey.UserWalletIds.name) diff --git a/app/src/main/java/com/tangem/tap/domain/walletStores/WalletStoresError.kt b/app/src/main/java/com/tangem/tap/domain/walletStores/WalletStoresError.kt index de8c07b6d2..826c158a8b 100644 --- a/app/src/main/java/com/tangem/tap/domain/walletStores/WalletStoresError.kt +++ b/app/src/main/java/com/tangem/tap/domain/walletStores/WalletStoresError.kt @@ -11,6 +11,7 @@ sealed class WalletStoresError(code: Int) : TangemError(code) { override val message: String? get() = customMessage + @Suppress("MagicNumber") class FetchFiatRatesError( currencies: List, override val cause: Throwable?, @@ -18,18 +19,22 @@ sealed class WalletStoresError(code: Int) : TangemError(code) { override var customMessage: String = "Failed to fetch fiat rates for currencies $currencies" } + @Suppress("MagicNumber") class UnknownBlockchain : WalletStoresError(60012) { override var customMessage: String = "Unknown blockchain" } + @Suppress("MagicNumber") object NoInternetConnection : WalletStoresError(60013) { override var customMessage: String = "No internet connection" } + @Suppress("MagicNumber") class WalletManagerNotCreated(blockchain: Blockchain) : WalletStoresError(60014) { override var customMessage: String = "Wallet manager can not be created for $blockchain" } + @Suppress("MagicNumber") class UpdateWalletManagerError( blockchain: Blockchain, override val cause: Throwable, diff --git a/app/src/main/java/com/tangem/tap/domain/walletStores/repository/implementation/DefaultWalletAmountsRepository.kt b/app/src/main/java/com/tangem/tap/domain/walletStores/repository/implementation/DefaultWalletAmountsRepository.kt index a9cb80f66e..4cf796096a 100644 --- a/app/src/main/java/com/tangem/tap/domain/walletStores/repository/implementation/DefaultWalletAmountsRepository.kt +++ b/app/src/main/java/com/tangem/tap/domain/walletStores/repository/implementation/DefaultWalletAmountsRepository.kt @@ -48,6 +48,7 @@ import kotlinx.coroutines.withContext import timber.log.Timber import java.math.BigDecimal +@Suppress("LargeClass") internal class DefaultWalletAmountsRepository( private val tangemTechApi: TangemTechApi, private val dispatchers: CoroutineDispatcherProvider, @@ -59,13 +60,16 @@ internal class DefaultWalletAmountsRepository( userWallets: List, fiatCurrency: FiatCurrency, ): CompletionResult { - return if (userWallets.isEmpty()) CompletionResult.Success(Unit) - else withContext(Dispatchers.Default) { - awaitAll( - async { fetchAmountsForUserWallets(userWallets) }, - async { fetchFiatRates(userWallets, walletStores = null, fiatCurrency) }, - ) - .fold() + return if (userWallets.isEmpty()) { + CompletionResult.Success(Unit) + } else { + withContext(Dispatchers.Default) { + awaitAll( + async { fetchAmountsForUserWallets(userWallets) }, + async { fetchFiatRates(userWallets, walletStores = null, fiatCurrency) }, + ) + .fold() + } } } @@ -81,16 +85,19 @@ internal class DefaultWalletAmountsRepository( userWallet: UserWallet, fiatCurrency: FiatCurrency, ): CompletionResult { - return if (walletStores.isEmpty()) CompletionResult.Success(Unit) - else withContext(Dispatchers.Default) { - val userWalletId = userWallet.walletId - val scanResponse = userWallet.scanResponse + return if (walletStores.isEmpty()) { + CompletionResult.Success(Unit) + } else { + withContext(Dispatchers.Default) { + val userWalletId = userWallet.walletId + val scanResponse = userWallet.scanResponse - awaitAll( - async { fetchAmountForWalletStores(userWalletId, scanResponse, walletStores) }, - async { fetchFiatRates(listOf(userWallet), walletStores, fiatCurrency) }, - ) - .fold() + awaitAll( + async { fetchAmountForWalletStores(userWalletId, scanResponse, walletStores) }, + async { fetchFiatRates(listOf(userWallet), walletStores, fiatCurrency) }, + ) + .fold() + } } } @@ -139,7 +146,7 @@ internal class DefaultWalletAmountsRepository( return@withContext CompletionResult.Failure(error) } - throw IllegalStateException("Unreachable code because runCatching must return result") + error("Unreachable code because runCatching must return result") } } @@ -168,7 +175,7 @@ internal class DefaultWalletAmountsRepository( ): CompletionResult = coroutineScope { walletStores.map { walletStore -> async { - // TODO: Find wallet manager via [com.tangem.tap.domain.walletStores.repository.WalletManagersRepository] + //TODO: Find wallet manager via [com.tangem.tap.domain.walletStores.repository.WalletManagersRepository] val walletManager = walletStore.walletManager fetchAmountsForWalletStore(userWalletId, scanResponse, walletStore, walletManager) } @@ -408,8 +415,10 @@ internal class DefaultWalletAmountsRepository( val error = WalletStoresError.NoInternetConnection Timber.e(error) CompletionResult.Failure(error) - } else withContext(Dispatchers.IO) { - catching { block() } + } else { + withContext(Dispatchers.IO) { + catching { block() } + } } } diff --git a/app/src/main/java/com/tangem/tap/domain/walletStores/repository/implementation/DefaultWalletManagersRepository.kt b/app/src/main/java/com/tangem/tap/domain/walletStores/repository/implementation/DefaultWalletManagersRepository.kt index 6355f2f6d6..788958565a 100644 --- a/app/src/main/java/com/tangem/tap/domain/walletStores/repository/implementation/DefaultWalletManagersRepository.kt +++ b/app/src/main/java/com/tangem/tap/domain/walletStores/repository/implementation/DefaultWalletManagersRepository.kt @@ -38,7 +38,9 @@ internal class DefaultWalletManagersRepository( return findOrMakeInternal(userWallet, blockchainNetwork) } - override suspend fun findOrMakeSingleCurrencyWalletManager(userWallet: UserWallet): CompletionResult { + override suspend fun findOrMakeSingleCurrencyWalletManager( + userWallet: UserWallet, + ): CompletionResult { return findOrMakeInternal(userWallet, blockchainNetwork = null) } @@ -180,8 +182,11 @@ internal class DefaultWalletManagersRepository( blockchain: Blockchain?, ): WalletManager? { return walletManagersStorage.getAll().first()[userWalletId]?.let { userWalletManagers -> - if (blockchain == null) userWalletManagers.firstOrNull() - else userWalletManagers.find { it.wallet.blockchain == blockchain } + if (blockchain == null) { + userWalletManagers.firstOrNull() + } else { + userWalletManagers.find { it.wallet.blockchain == blockchain } + } } } diff --git a/app/src/main/java/com/tangem/tap/domain/walletStores/storage/WalletManagerStorage.kt b/app/src/main/java/com/tangem/tap/domain/walletStores/storage/WalletManagerStorage.kt index 3646e38f6a..866711e543 100644 --- a/app/src/main/java/com/tangem/tap/domain/walletStores/storage/WalletManagerStorage.kt +++ b/app/src/main/java/com/tangem/tap/domain/walletStores/storage/WalletManagerStorage.kt @@ -11,8 +11,8 @@ import kotlinx.coroutines.sync.Mutex import kotlinx.coroutines.sync.withLock internal object WalletManagerStorage { - private val managers = - MutableSharedFlow>>(replay = 1) + private val managers = MutableSharedFlow>>(replay = 1) + private val mutex = Mutex() init { managers.tryEmit(hashMapOf()) @@ -22,7 +22,6 @@ internal object WalletManagerStorage { return managers.asSharedFlow() } - private val mutex = Mutex() suspend fun update( f: suspend (HashMap>) -> HashMap>, ) { diff --git a/app/src/main/java/com/tangem/tap/domain/walletStores/storage/WalletStoresStorage.kt b/app/src/main/java/com/tangem/tap/domain/walletStores/storage/WalletStoresStorage.kt index 93cdfb508f..932abce88b 100644 --- a/app/src/main/java/com/tangem/tap/domain/walletStores/storage/WalletStoresStorage.kt +++ b/app/src/main/java/com/tangem/tap/domain/walletStores/storage/WalletStoresStorage.kt @@ -11,8 +11,8 @@ import kotlinx.coroutines.sync.Mutex import kotlinx.coroutines.sync.withLock internal object WalletStoresStorage { - private val stores = - MutableSharedFlow>>(replay = 1) + private val stores = MutableSharedFlow>>(replay = 1) + private val mutex = Mutex() init { stores.tryEmit(hashMapOf()) @@ -22,7 +22,6 @@ internal object WalletStoresStorage { return stores.asSharedFlow() } - private val mutex = Mutex() suspend fun update( f: suspend (HashMap>) -> HashMap>, ) { diff --git a/app/src/main/java/com/tangem/tap/domain/walletconnect/BnbHelper.kt b/app/src/main/java/com/tangem/tap/domain/walletconnect/BnbHelper.kt index d35cc7c2e0..5dec1d0850 100644 --- a/app/src/main/java/com/tangem/tap/domain/walletconnect/BnbHelper.kt +++ b/app/src/main/java/com/tangem/tap/domain/walletconnect/BnbHelper.kt @@ -12,69 +12,65 @@ import com.trustwallet.walletconnect.models.binance.WCBinanceTransferOrder import com.trustwallet.walletconnect.models.binance.tradeOrderSerializer import timber.log.Timber -class BnbHelper { - companion object { +object BnbHelper { + fun createMessageData(order: WCBinanceTransferOrder): BinanceMessageData.Transfer { + val input = order.msgs.first().inputs.first() + val output = order.msgs.first().inputs.first() - fun createMessageData(order: WCBinanceTransferOrder): BinanceMessageData.Transfer { - val input = order.msgs.first().inputs.first() - val output = order.msgs.first().inputs.first() + val currency = + input.coins.firstOrNull()?.denom ?: Blockchain.Binance + val amount = input.coins + .mapNotNull { if (it.denom == currency) it.amount else null } + .sum() + .toBigDecimal() + .movePointLeft(Blockchain.Binance.decimals()) + .stripZeroPlainString() - val currency = - input.coins.firstOrNull()?.denom ?: Blockchain.Binance - val amount = input.coins - .mapNotNull { if (it.denom == currency) it.amount else null } - .sum() - .toBigDecimal() - .movePointLeft(Blockchain.Binance.decimals()) - .stripZeroPlainString() - - val gson = GsonBuilder() - .registerTypeAdapter(tradeOrderSerializer) - .serializeNulls() - .create() - - return BinanceMessageData.Transfer( - outputAddress = output.address, - amount = amount, - address = input.address, - data = gson.toJson(order).toByteArray().calculateSha256() - ) - } - - fun createMessageData(order: WCBinanceTradeOrder): BinanceMessageData.Trade { - val address = order.msgs.first().sender - - val tradeData = order.msgs.map { - val price = it.price.toBigDecimal() - .movePointLeft(Blockchain.Binance.decimals()) - .stripTrailingZeros() - val quantity = it.quantity.toBigDecimal() - .movePointLeft(Blockchain.Binance.decimals()) - .stripTrailingZeros() - - val amount = price * quantity - val symbol = it.symbol.substringBefore("-") - - TradeData( - price = "$price ${Blockchain.Binance.currency}", - quantity = "$quantity $symbol", - amount = "$amount ${Blockchain.Binance.currency}", - symbol = symbol - ) - } - val gson = GsonBuilder() - .registerTypeAdapter(tradeOrderSerializer) - .serializeNulls() - .create() - val serialized = gson.toJson(order) - Timber.d(serialized) - - return BinanceMessageData.Trade( - tradeData = tradeData, - address = address, - data = serialized.toByteArray().calculateSha256() - ) - } + val gson = GsonBuilder() + .registerTypeAdapter(tradeOrderSerializer) + .serializeNulls() + .create() + return BinanceMessageData.Transfer( + outputAddress = output.address, + amount = amount, + address = input.address, + data = gson.toJson(order).toByteArray().calculateSha256(), + ) } -} + + fun createMessageData(order: WCBinanceTradeOrder): BinanceMessageData.Trade { + val address = order.msgs.first().sender + + val tradeData = order.msgs.map { + val price = it.price.toBigDecimal() + .movePointLeft(Blockchain.Binance.decimals()) + .stripTrailingZeros() + val quantity = it.quantity.toBigDecimal() + .movePointLeft(Blockchain.Binance.decimals()) + .stripTrailingZeros() + + val amount = price * quantity + val symbol = it.symbol.substringBefore("-") + + TradeData( + price = "$price ${Blockchain.Binance.currency}", + quantity = "$quantity $symbol", + amount = "$amount ${Blockchain.Binance.currency}", + symbol = symbol, + ) + } + val gson = GsonBuilder() + .registerTypeAdapter(tradeOrderSerializer) + .serializeNulls() + .create() + val serialized = gson.toJson(order) + Timber.d(serialized) + + return BinanceMessageData.Trade( + tradeData = tradeData, + address = address, + data = serialized.toByteArray().calculateSha256(), + ) + } +} \ No newline at end of file diff --git a/app/src/main/java/com/tangem/tap/domain/walletconnect/EthSignHelper.kt b/app/src/main/java/com/tangem/tap/domain/walletconnect/EthSignHelper.kt index b366229775..a302d44747 100644 --- a/app/src/main/java/com/tangem/tap/domain/walletconnect/EthSignHelper.kt +++ b/app/src/main/java/com/tangem/tap/domain/walletconnect/EthSignHelper.kt @@ -9,50 +9,28 @@ import com.google.gson.JsonParser import com.google.gson.annotations.SerializedName import com.tangem.blockchain.common.Blockchain import com.trustwallet.walletconnect.JSONRPC_VERSION -import com.trustwallet.walletconnect.models.ethereum.WCEthereumSignMessage -class EthSignHelper { - companion object { - private val gson: Gson by lazy { - GsonBuilder() - .setPrettyPrinting() - .serializeNulls() - .create() - } +object EthSignHelper { + private val gson: Gson by lazy { + GsonBuilder() + .setPrettyPrinting() + .serializeNulls() + .create() + } - fun parseCustomRequest(data: String): CustomJsonRpcRequest { - return gson.fromJson(data) - } - - fun tryToParseEthTypedMessage(request: CustomJsonRpcRequest): WCEthereumSignMessage? { - return if (request.method == WCMethodExtended.ETH_SIGN_TYPE_DATA_V4) { - WCEthereumSignMessage( - listOf( - request.params[0].asString, - request.params[1].asString, - ), - WCEthereumSignMessage.WCSignType.TYPED_MESSAGE - ) - } else { - null - } - } - - fun tryToParseEthTypedMessageString(message: String): String? { - return try { - val messageString = message - .replace("\\", "") - .removePrefix("\"") - .removeSuffix("\"") - val messageJson = JsonParser().parse(messageString) - val filteredMap = gson.fromJson>(messageJson) - .filterKeys { it == "domain" || it == "message"} - - gson.toJson(filteredMap) - } catch (exception: Exception) { - null - } + fun tryToParseEthTypedMessageString(message: String): String? { + return try { + val messageString = message + .replace("\\", "") + .removePrefix("\"") + .removeSuffix("\"") + val messageJson = JsonParser().parse(messageString) + val filteredMap = gson.fromJson>(messageJson) + .filterKeys { it == "domain" || it == "message" } + gson.toJson(filteredMap) + } catch (exception: Exception) { + null } } } @@ -61,7 +39,7 @@ data class CustomJsonRpcRequest( val id: Long, val jsonrpc: String = JSONRPC_VERSION, val method: WCMethodExtended?, - val params: JsonArray + val params: JsonArray, ) { fun blockchainFromChainId(): Blockchain? { diff --git a/app/src/main/java/com/tangem/tap/domain/walletconnect/WalletConnectManager.kt b/app/src/main/java/com/tangem/tap/domain/walletconnect/WalletConnectManager.kt index 33850fc1c6..6b96fc0f6a 100644 --- a/app/src/main/java/com/tangem/tap/domain/walletconnect/WalletConnectManager.kt +++ b/app/src/main/java/com/tangem/tap/domain/walletconnect/WalletConnectManager.kt @@ -3,8 +3,8 @@ package com.tangem.tap.domain.walletconnect import com.tangem.blockchain.common.Blockchain import com.tangem.common.card.EllipticCurve import com.tangem.common.extensions.guard -import com.tangem.domain.common.ScanResponse import com.tangem.core.analytics.Analytics +import com.tangem.domain.common.ScanResponse import com.tangem.tap.common.analytics.events.WalletConnect import com.tangem.tap.common.extensions.dispatchOnMain import com.tangem.tap.common.redux.global.GlobalAction @@ -43,6 +43,7 @@ import java.util.* import java.util.concurrent.TimeUnit import kotlin.collections.set +@Suppress("LargeClass") class WalletConnectManager { private var cardId: String? = null @@ -126,6 +127,7 @@ class WalletConnectManager { } } + @Suppress("MagicNumber") private fun setupConnectionTimeoutCheck(session: WCSession) { scope.launch { delay(20_000) @@ -345,6 +347,7 @@ class WalletConnectManager { } } + @Suppress("LongMethod", "ComplexMethod") fun setListeners(client: WCClient) { client.onSessionRequest = { id: Long, peer: WCPeerMeta -> Timber.d("OnSessionRequest: $peer") @@ -490,12 +493,11 @@ class WalletConnectManager { } companion object { - private val tangemPeerMeta = - WCPeerMeta(name = "Tangem Wallet", url = "https://tangem.com") + const val WC_SCHEME = "wc" + + private val tangemPeerMeta = WCPeerMeta(name = "Tangem Wallet", url = "https://tangem.com") fun isCorrectWcUri(string: String): Boolean = WCSession.from(string) != null - - const val WC_SCHEME = "wc" } } @@ -521,6 +523,7 @@ data class WalletConnectActiveData( } } +@Suppress("MagicNumber") class RetryInterceptor : Interceptor { override fun intercept(chain: Interceptor.Chain): Response { val request: Request = chain.request() diff --git a/app/src/main/java/com/tangem/tap/domain/walletconnect/WalletConnectNetworkUtils.kt b/app/src/main/java/com/tangem/tap/domain/walletconnect/WalletConnectNetworkUtils.kt index d186cad24f..19e2e44e42 100644 --- a/app/src/main/java/com/tangem/tap/domain/walletconnect/WalletConnectNetworkUtils.kt +++ b/app/src/main/java/com/tangem/tap/domain/walletconnect/WalletConnectNetworkUtils.kt @@ -3,46 +3,39 @@ package com.tangem.tap.domain.walletconnect import com.tangem.blockchain.common.Blockchain import com.trustwallet.walletconnect.models.WCPeerMeta -class WalletConnectNetworkUtils { - - companion object { - - fun parseBlockchain( - chainId: Int?, - peer: WCPeerMeta, - ): Blockchain? { - return when { - peer.url.contains("pancakeswap.finance") -> { - Blockchain.BSC - } - peer.url.contains("optimism") -> { - Blockchain.Optimism - } - chainId != null -> { - Blockchain.fromChainId(chainId) - } - peer.url.contains("matic.network") || peer.name == "Polygon" -> { - Blockchain.Polygon - } - peer.url.contains("binance.org") || peer.name.contains("Binance") -> { - if (peer.icons.firstOrNull()?.contains("testnet") == true) { - Blockchain.BinanceTestnet - } else { - Blockchain.Binance - } - } - peer.name.contains("BSC") -> { - Blockchain.BSC - } - peer.url.contains("honeyswap.1hive.eth.limo") -> { - // Check if something's changed after this bug report: - // https://github.com/1Hive/honeyswap-interface/issues/83 - Blockchain.Gnosis - } - else -> { - Blockchain.Ethereum +object WalletConnectNetworkUtils { + fun parseBlockchain(chainId: Int?, peer: WCPeerMeta): Blockchain? { + return when { + peer.url.contains("pancakeswap.finance") -> { + Blockchain.BSC + } + peer.url.contains("optimism") -> { + Blockchain.Optimism + } + chainId != null -> { + Blockchain.fromChainId(chainId) + } + peer.url.contains("matic.network") || peer.name == "Polygon" -> { + Blockchain.Polygon + } + peer.url.contains("binance.org") || peer.name.contains("Binance") -> { + if (peer.icons.firstOrNull()?.contains("testnet") == true) { + Blockchain.BinanceTestnet + } else { + Blockchain.Binance } } + peer.name.contains("BSC") -> { + Blockchain.BSC + } + peer.url.contains("honeyswap.1hive.eth.limo") -> { + // Check if something's changed after this bug report: + // https://github.com/1Hive/honeyswap-interface/issues/83 + Blockchain.Gnosis + } + else -> { + Blockchain.Ethereum + } } } } \ No newline at end of file diff --git a/app/src/main/java/com/tangem/tap/domain/walletconnect/WalletConnectSdkHelper.kt b/app/src/main/java/com/tangem/tap/domain/walletconnect/WalletConnectSdkHelper.kt index 2ad236bd6c..6448911980 100644 --- a/app/src/main/java/com/tangem/tap/domain/walletconnect/WalletConnectSdkHelper.kt +++ b/app/src/main/java/com/tangem/tap/domain/walletconnect/WalletConnectSdkHelper.kt @@ -22,9 +22,9 @@ import com.tangem.common.core.TangemSdkError import com.tangem.common.extensions.hexToBytes import com.tangem.common.extensions.toDecompressedPublicKey import com.tangem.common.extensions.toHexString +import com.tangem.core.analytics.Analytics import com.tangem.crypto.CryptoUtils import com.tangem.operations.sign.SignHashCommand -import com.tangem.core.analytics.Analytics import com.tangem.tap.common.analytics.events.WalletConnect import com.tangem.tap.common.extensions.safeUpdate import com.tangem.tap.common.extensions.toFormattedString @@ -48,6 +48,7 @@ import java.math.BigDecimal class WalletConnectSdkHelper { + @Suppress("MagicNumber") suspend fun prepareTransactionData( transaction: WCEthereumTransaction, session: WalletConnectSession, @@ -101,7 +102,7 @@ class WalletConnectSdkHelper { gasAmount = fee.toFormattedString(decimals), totalAmount = total.toFormattedString(decimals), balance = balance.toFormattedString(decimals), - isEnoughFundsToSend = (balance - total) >= BigDecimal.ZERO, + isEnoughFundsToSend = balance - total >= BigDecimal.ZERO, session = session.session, id = id, type = type, diff --git a/app/src/main/java/com/tangem/tap/features/BaseStoreFragment.kt b/app/src/main/java/com/tangem/tap/features/BaseStoreFragment.kt index b4f486a1a2..e295c9f100 100644 --- a/app/src/main/java/com/tangem/tap/features/BaseStoreFragment.kt +++ b/app/src/main/java/com/tangem/tap/features/BaseStoreFragment.kt @@ -8,9 +8,10 @@ import org.rekotlin.StoreSubscriber */ abstract class BaseStoreFragment(layoutId: Int) : BaseFragment(layoutId) { - abstract fun subscribeToStore() protected val storeSubscribersList = mutableListOf>() + abstract fun subscribeToStore() + override fun onStart() { super.onStart() subscribeToStore() diff --git a/app/src/main/java/com/tangem/tap/features/demo/DemoHelper.kt b/app/src/main/java/com/tangem/tap/features/demo/DemoHelper.kt index a5823818dd..ec0f95eece 100644 --- a/app/src/main/java/com/tangem/tap/features/demo/DemoHelper.kt +++ b/app/src/main/java/com/tangem/tap/features/demo/DemoHelper.kt @@ -82,6 +82,7 @@ object DemoHelper { } } +@Suppress("LargeClass") class DemoConfig { val demoBlockchains = listOf( @@ -114,6 +115,7 @@ class DemoConfig { return (releaseDemoCardIds + testDemoCardIds).distinct() } + @Suppress("ClassOrdering") private val releaseDemoCardIds = mutableListOf( // === Not from the Google Sheet table === "FB10000000000196", // Note BTC @@ -476,20 +478,19 @@ class DemoConfig { "AB02000000058187", ) + @Suppress("ClassOrdering") private val testDemoCardIds = listOf( "FB20000000000186", // Note ETH "FB10000000000196", // Note BTC "FB30000000000176", // Wallet ) + @Suppress("ClassOrdering") private val debugTestDemoCardIds = listOf( ) } -class DemoTransactionSender( - private val walletManager: WalletManager, - private val sender: TransactionSender = walletManager as TransactionSender -) : TransactionSender { +class DemoTransactionSender(private val walletManager: WalletManager) : TransactionSender { override suspend fun getFee(amount: Amount, destination: String): Result> { val blockchain = walletManager.wallet.blockchain @@ -502,6 +503,7 @@ class DemoTransactionSender( ) } + @Suppress("MagicNumber") override suspend fun send(transactionData: TransactionData, signer: TransactionSigner): SimpleResult { val dataToSign = randomString(32).toByteArray() val signerResponse = signer.sign( diff --git a/app/src/main/java/com/tangem/tap/features/demo/DemoMiddlewares.kt b/app/src/main/java/com/tangem/tap/features/demo/DemoOnboardingNoteMiddleware.kt similarity index 98% rename from app/src/main/java/com/tangem/tap/features/demo/DemoMiddlewares.kt rename to app/src/main/java/com/tangem/tap/features/demo/DemoOnboardingNoteMiddleware.kt index 87af003060..9b391b22df 100644 --- a/app/src/main/java/com/tangem/tap/features/demo/DemoMiddlewares.kt +++ b/app/src/main/java/com/tangem/tap/features/demo/DemoOnboardingNoteMiddleware.kt @@ -39,7 +39,7 @@ internal class DemoOnboardingNoteMiddleware : DemoMiddleware { currency = Currency.Blockchain(walletManager.wallet.blockchain, null), state = ProgressState.Done, error = null, - criticalError = null + criticalError = null, ) walletManager.wallet.setAmount(balanceAmount) diff --git a/app/src/main/java/com/tangem/tap/features/details/redux/DetailsMiddleware.kt b/app/src/main/java/com/tangem/tap/features/details/redux/DetailsMiddleware.kt index f6e2c4b7c4..602bfa3378 100644 --- a/app/src/main/java/com/tangem/tap/features/details/redux/DetailsMiddleware.kt +++ b/app/src/main/java/com/tangem/tap/features/details/redux/DetailsMiddleware.kt @@ -5,8 +5,8 @@ import com.tangem.common.core.TangemSdkError import com.tangem.common.doOnFailure import com.tangem.common.doOnSuccess import com.tangem.common.flatMap -import com.tangem.domain.common.TapWorkarounds.isTangemTwins import com.tangem.core.analytics.Analytics +import com.tangem.domain.common.TapWorkarounds.isTangemTwins import com.tangem.tap.common.analytics.events.AnalyticsParam import com.tangem.tap.common.analytics.events.Settings import com.tangem.tap.common.extensions.dispatchDialogShow @@ -146,6 +146,7 @@ class DetailsMiddleware { } class ManageSecurityMiddleware { + @Suppress("ComplexMethod") fun handle(action: DetailsAction.ManageSecurity) { when (action) { is DetailsAction.ManageSecurity.OpenSecurity -> { diff --git a/app/src/main/java/com/tangem/tap/features/details/redux/DetailsReducer.kt b/app/src/main/java/com/tangem/tap/features/details/redux/DetailsReducer.kt index 44b5e293cb..9b6814f90e 100644 --- a/app/src/main/java/com/tangem/tap/features/details/redux/DetailsReducer.kt +++ b/app/src/main/java/com/tangem/tap/features/details/redux/DetailsReducer.kt @@ -15,10 +15,8 @@ import com.tangem.tap.tangemSdkManager import org.rekotlin.Action import java.util.* -class DetailsReducer { - companion object { - fun reduce(action: Action, state: AppState): DetailsState = internalReduce(action, state) - } +object DetailsReducer { + fun reduce(action: Action, state: AppState): DetailsState = internalReduce(action, state) } private fun internalReduce(action: Action, state: AppState): DetailsState { @@ -104,8 +102,7 @@ private fun prepareSecurityOptions(card: CardDTO): ManageSecurityState { private fun isResetToFactoryAllowedByCard(card: CardDTO): Boolean { val notAllowedByAnyWallet = card.wallets.any { it.settings.isPermanent } val notAllowedByCard = notAllowedByAnyWallet || - (card.isWalletDataSupported && (!card.isTangemNote && !card.settings.isBackupAllowed)) || - card.isSaltPay + card.isWalletDataSupported && !card.isTangemNote && !card.settings.isBackupAllowed || card.isSaltPay return !notAllowedByCard } @@ -188,6 +185,7 @@ private fun prepareAllowedSecurityOptions( return allowedSecurityOptions } +@Suppress("MagicNumber") private fun CardDTO.toCardInfo(): CardInfo { val cardId = this.cardId.chunked(4).joinToString(separator = " ") val issuer = this.issuer.name diff --git a/app/src/main/java/com/tangem/tap/features/details/redux/walletconnect/WalletConnectMiddleware.kt b/app/src/main/java/com/tangem/tap/features/details/redux/walletconnect/WalletConnectMiddleware.kt index 7818f367b3..958d119c37 100644 --- a/app/src/main/java/com/tangem/tap/features/details/redux/walletconnect/WalletConnectMiddleware.kt +++ b/app/src/main/java/com/tangem/tap/features/details/redux/walletconnect/WalletConnectMiddleware.kt @@ -40,6 +40,7 @@ class WalletConnectMiddleware { } } + @Suppress("ComplexMethod", "LongMethod") private fun handle(state: () -> AppState?, action: Action) { if (DemoHelper.tryHandle(state, action)) return @@ -49,10 +50,8 @@ class WalletConnectMiddleware { walletConnectManager.restoreSessions(action.scanResponse) } is WalletConnectAction.HandleDeepLink -> { - if (!action.wcUri.isNullOrBlank()) { - if (WalletConnectManager.isCorrectWcUri(action.wcUri)) { - store.dispatchOnMain(WalletConnectAction.OpenSession(action.wcUri)) - } + if (!action.wcUri.isNullOrBlank() && WalletConnectManager.isCorrectWcUri(action.wcUri)) { + store.dispatchOnMain(WalletConnectAction.OpenSession(action.wcUri)) } } is WalletConnectAction.StartWalletConnect -> { diff --git a/app/src/main/java/com/tangem/tap/features/details/redux/walletconnect/WalletConnectReducer.kt b/app/src/main/java/com/tangem/tap/features/details/redux/walletconnect/WalletConnectReducer.kt index e4cc76254c..811a934f3d 100644 --- a/app/src/main/java/com/tangem/tap/features/details/redux/walletconnect/WalletConnectReducer.kt +++ b/app/src/main/java/com/tangem/tap/features/details/redux/walletconnect/WalletConnectReducer.kt @@ -2,47 +2,44 @@ package com.tangem.tap.features.details.redux.walletconnect import org.rekotlin.Action -class WalletConnectReducer { - companion object { - fun reduce( - action: Action, state: WalletConnectState, - ): WalletConnectState { - if (action !is WalletConnectAction) return state +object WalletConnectReducer { + fun reduce( + action: Action, state: WalletConnectState, + ): WalletConnectState { + if (action !is WalletConnectAction) return state - return when (action) { - is WalletConnectAction.ResetState -> return WalletConnectState() - is WalletConnectAction.ApproveSession.Success -> { - state.copy( - loading = false, - sessions = state.sessions + action.session, - ) - } - is WalletConnectAction.OpenSession -> { - state.copy(loading = true) - } - is WalletConnectAction.SetNewSessionData -> { - state.copy(newSessionData = action.newSession) - } - is WalletConnectAction.SetSessionsRestored -> - WalletConnectState(sessions = action.sessions) - is WalletConnectAction.RemoveSession -> { - val sessions = - state.sessions.filterNot { it.session.toUri() == action.session.toUri() } - state.copy(sessions = sessions) - } - is WalletConnectAction.UnsupportedCard -> state.copy(loading = false) - is WalletConnectAction.RefuseOpeningSession -> state.copy(loading = false) - is WalletConnectAction.OpeningSessionTimeout -> state.copy(loading = false) - is WalletConnectAction.FailureEstablishingSession -> state.copy(loading = false) - is WalletConnectAction.UpdateBlockchain -> state.copy( - sessions = state.sessions - .filterNot { it.peerId == action.updatedSession.peerId } - + action.updatedSession + return when (action) { + is WalletConnectAction.ResetState -> return WalletConnectState() + is WalletConnectAction.ApproveSession.Success -> { + state.copy( + loading = false, + sessions = state.sessions + action.session, ) - - else -> state } - } + is WalletConnectAction.OpenSession -> { + state.copy(loading = true) + } + is WalletConnectAction.SetNewSessionData -> { + state.copy(newSessionData = action.newSession) + } + is WalletConnectAction.SetSessionsRestored -> + WalletConnectState(sessions = action.sessions) + is WalletConnectAction.RemoveSession -> { + val sessions = + state.sessions.filterNot { it.session.toUri() == action.session.toUri() } + state.copy(sessions = sessions) + } + is WalletConnectAction.UnsupportedCard -> state.copy(loading = false) + is WalletConnectAction.RefuseOpeningSession -> state.copy(loading = false) + is WalletConnectAction.OpeningSessionTimeout -> state.copy(loading = false) + is WalletConnectAction.FailureEstablishingSession -> state.copy(loading = false) + is WalletConnectAction.UpdateBlockchain -> state.copy( + sessions = state.sessions + .filterNot { it.peerId == action.updatedSession.peerId } + + action.updatedSession, + ) + else -> state + } } } \ No newline at end of file diff --git a/app/src/main/java/com/tangem/tap/features/details/redux/walletconnect/WalletConnectState.kt b/app/src/main/java/com/tangem/tap/features/details/redux/walletconnect/WalletConnectState.kt index 97afb372a2..53e37c8d80 100644 --- a/app/src/main/java/com/tangem/tap/features/details/redux/walletconnect/WalletConnectState.kt +++ b/app/src/main/java/com/tangem/tap/features/details/redux/walletconnect/WalletConnectState.kt @@ -74,7 +74,7 @@ data class WalletForSession( } override fun hashCode(): Int { - var result = (walletPublicKey?.contentHashCode() ?: 0) + var result = walletPublicKey?.contentHashCode() ?: 0 result = 31 * result + (derivedPublicKey?.contentHashCode() ?: 0) result = 31 * result + (derivationPath?.hashCode() ?: 0) result = 31 * result + isTestNet.hashCode() diff --git a/app/src/main/java/com/tangem/tap/features/details/ui/appsettings/AppSettingsScreen.kt b/app/src/main/java/com/tangem/tap/features/details/ui/appsettings/AppSettingsScreen.kt index b072be7b74..ad15a780b8 100644 --- a/app/src/main/java/com/tangem/tap/features/details/ui/appsettings/AppSettingsScreen.kt +++ b/app/src/main/java/com/tangem/tap/features/details/ui/appsettings/AppSettingsScreen.kt @@ -89,6 +89,7 @@ private fun AppSettings( } } +@Suppress("LongMethod") @Composable private fun AppSettingsElement( modifier: Modifier = Modifier, diff --git a/app/src/main/java/com/tangem/tap/features/details/ui/cardsettings/CardSettingsScreen.kt b/app/src/main/java/com/tangem/tap/features/details/ui/cardsettings/CardSettingsScreen.kt index 0b1063c381..7a0092384a 100644 --- a/app/src/main/java/com/tangem/tap/features/details/ui/cardsettings/CardSettingsScreen.kt +++ b/app/src/main/java/com/tangem/tap/features/details/ui/cardsettings/CardSettingsScreen.kt @@ -51,6 +51,7 @@ fun CardSettingsScreen( ) } +@Suppress("MagicNumber") @Composable fun CardSettingsReadCard( onScanCardClick: () -> Unit, @@ -114,6 +115,7 @@ fun CardSettingsReadCard( } } +@Suppress("ComplexMethod") @Composable fun CardSettings( state: CardSettingsScreenState, diff --git a/app/src/main/java/com/tangem/tap/features/details/ui/cardsettings/CardSettingsViewModel.kt b/app/src/main/java/com/tangem/tap/features/details/ui/cardsettings/CardSettingsViewModel.kt index 969b3e4408..1f5353c548 100644 --- a/app/src/main/java/com/tangem/tap/features/details/ui/cardsettings/CardSettingsViewModel.kt +++ b/app/src/main/java/com/tangem/tap/features/details/ui/cardsettings/CardSettingsViewModel.kt @@ -1,14 +1,13 @@ package com.tangem.tap.features.details.ui.cardsettings +import com.tangem.core.analytics.Analytics import com.tangem.domain.common.TapWorkarounds.isTangemTwins import com.tangem.domain.common.getTwinCardIdForUser -import com.tangem.core.analytics.Analytics import com.tangem.tap.common.analytics.events.AnalyticsParam import com.tangem.tap.common.analytics.events.Settings import com.tangem.tap.common.redux.AppState import com.tangem.tap.features.details.redux.CardSettingsState import com.tangem.tap.features.details.redux.DetailsAction -import com.tangem.wallet.R import org.rekotlin.Store class CardSettingsViewModel(private val store: Store) { diff --git a/app/src/main/java/com/tangem/tap/features/details/ui/common/TangemSwitch.kt b/app/src/main/java/com/tangem/tap/features/details/ui/common/TangemSwitch.kt index d511348af9..ce5be61078 100644 --- a/app/src/main/java/com/tangem/tap/features/details/ui/common/TangemSwitch.kt +++ b/app/src/main/java/com/tangem/tap/features/details/ui/common/TangemSwitch.kt @@ -30,6 +30,7 @@ import androidx.compose.ui.unit.Dp import androidx.compose.ui.unit.dp import com.tangem.wallet.R +@Suppress("MagicNumber") @Composable fun TangemSwitch( modifier: Modifier = Modifier, diff --git a/app/src/main/java/com/tangem/tap/features/details/ui/details/DetailsViewModel.kt b/app/src/main/java/com/tangem/tap/features/details/ui/details/DetailsViewModel.kt index 6165dc5c39..cf2e38f02b 100644 --- a/app/src/main/java/com/tangem/tap/features/details/ui/details/DetailsViewModel.kt +++ b/app/src/main/java/com/tangem/tap/features/details/ui/details/DetailsViewModel.kt @@ -1,8 +1,7 @@ package com.tangem.tap.features.details.ui.details -import com.tangem.domain.common.TapWorkarounds.isSaltPay -import com.tangem.domain.common.TapWorkarounds.isStart2Coin import com.tangem.core.analytics.Analytics +import com.tangem.domain.common.TapWorkarounds.isSaltPay import com.tangem.tap.common.analytics.events.Settings import com.tangem.tap.common.feedback.FeedbackEmail import com.tangem.tap.common.feedback.SupportInfo @@ -21,6 +20,8 @@ import com.tangem.wallet.BuildConfig import org.rekotlin.Store class DetailsViewModel(private val store: Store) { + + @Suppress("ComplexMethod") fun updateState(state: DetailsState): DetailsScreenState { val settings = SettingsElement.values().mapNotNull { when (it) { diff --git a/app/src/main/java/com/tangem/tap/features/details/ui/resetcard/ResetCardScreen.kt b/app/src/main/java/com/tangem/tap/features/details/ui/resetcard/ResetCardScreen.kt index 02095d290a..0f57b021f1 100644 --- a/app/src/main/java/com/tangem/tap/features/details/ui/resetcard/ResetCardScreen.kt +++ b/app/src/main/java/com/tangem/tap/features/details/ui/resetcard/ResetCardScreen.kt @@ -42,6 +42,7 @@ fun ResetCardScreen(state: ResetCardScreenState, onBackPressed: () -> Unit) { ) } +@Suppress("LongMethod", "MagicNumber") @Composable fun ResetCardView(state: ResetCardScreenState) { Column( diff --git a/app/src/main/java/com/tangem/tap/features/details/ui/securitymode/SecurityModeViewModel.kt b/app/src/main/java/com/tangem/tap/features/details/ui/securitymode/SecurityModeViewModel.kt index b25277864d..a0666ff19d 100644 --- a/app/src/main/java/com/tangem/tap/features/details/ui/securitymode/SecurityModeViewModel.kt +++ b/app/src/main/java/com/tangem/tap/features/details/ui/securitymode/SecurityModeViewModel.kt @@ -9,13 +9,15 @@ import org.rekotlin.Store class SecurityModeViewModel(val store: Store) { fun updateState(state: ManageSecurityState?): SecurityModeScreenState { - if (state == null) return SecurityModeScreenState( - availableOptions = emptyList(), - selectedSecurityMode = SecurityOption.LongTap, - isSaveChangesEnabled = false, - onNewModeSelected = {}, - onSaveChangesClicked = {}, - ) + if (state == null) { + return SecurityModeScreenState( + availableOptions = emptyList(), + selectedSecurityMode = SecurityOption.LongTap, + isSaveChangesEnabled = false, + onNewModeSelected = {}, + onSaveChangesClicked = {}, + ) + } return SecurityModeScreenState( availableOptions = state.allowedOptions.toList(), selectedSecurityMode = state.selectedOption, diff --git a/app/src/main/java/com/tangem/tap/features/details/ui/walletconnect/dialogs/ApproveWcSessionDialog.kt b/app/src/main/java/com/tangem/tap/features/details/ui/walletconnect/dialogs/ApproveWcSessionDialog.kt index da8e03c3b8..aba68641df 100644 --- a/app/src/main/java/com/tangem/tap/features/details/ui/walletconnect/dialogs/ApproveWcSessionDialog.kt +++ b/app/src/main/java/com/tangem/tap/features/details/ui/walletconnect/dialogs/ApproveWcSessionDialog.kt @@ -9,38 +9,36 @@ import com.tangem.tap.features.details.redux.walletconnect.WalletConnectSession import com.tangem.tap.store import com.tangem.wallet.R -class ApproveWcSessionDialog { - companion object { - fun create(session: WalletConnectSession, networks: List, context: Context): AlertDialog { - val sessionBlockchain = requireNotNull(session.wallet.blockchain) { "session network is null" } - val message = context.getString( - R.string.wallet_connect_request_session_start, - session.peerMeta.name, - sessionBlockchain.fullName, - session.peerMeta.url, - ) - return AlertDialog.Builder(context).apply { - setTitle(context.getString(R.string.wallet_connect_title)) - setMessage(message) - setPositiveButton(context.getText(R.string.common_start)) { _, _ -> +object ApproveWcSessionDialog { + fun create(session: WalletConnectSession, networks: List, context: Context): AlertDialog { + val sessionBlockchain = requireNotNull(session.wallet.blockchain) { "session network is null" } + val message = context.getString( + R.string.wallet_connect_request_session_start, + session.peerMeta.name, + sessionBlockchain.fullName, + session.peerMeta.url, + ) + return AlertDialog.Builder(context).apply { + setTitle(context.getString(R.string.wallet_connect_title)) + setMessage(message) + setPositiveButton(context.getText(R.string.common_start)) { _, _ -> + store.dispatch(GlobalAction.HideDialog) + store.dispatch(WalletConnectAction.ChooseNetwork(sessionBlockchain)) + } + if (networks.size > 1) { + setNeutralButton(context.getText(R.string.wallet_connect_select_network)) { _, _ -> store.dispatch(GlobalAction.HideDialog) - store.dispatch(WalletConnectAction.ChooseNetwork(sessionBlockchain)) + store.dispatch(WalletConnectAction.SelectNetwork(session = session, networks = networks)) } - if (networks.size > 1) { - setNeutralButton(context.getText(R.string.wallet_connect_select_network)) { _, _ -> - store.dispatch(GlobalAction.HideDialog) - store.dispatch(WalletConnectAction.SelectNetwork(session = session, networks = networks)) - } - } - setNegativeButton(context.getText(R.string.common_reject)) { _, _ -> - store.dispatch(GlobalAction.HideDialog) - store.dispatch(WalletConnectAction.FailureEstablishingSession(session.session)) - } - setOnCancelListener { - store.dispatch(GlobalAction.HideDialog) - store.dispatch(WalletConnectAction.FailureEstablishingSession(session.session)) - } - }.create() - } + } + setNegativeButton(context.getText(R.string.common_reject)) { _, _ -> + store.dispatch(GlobalAction.HideDialog) + store.dispatch(WalletConnectAction.FailureEstablishingSession(session.session)) + } + setOnCancelListener { + store.dispatch(GlobalAction.HideDialog) + store.dispatch(WalletConnectAction.FailureEstablishingSession(session.session)) + } + }.create() } } \ No newline at end of file diff --git a/app/src/main/java/com/tangem/tap/features/details/ui/walletconnect/dialogs/BnbTransactionDialog.kt b/app/src/main/java/com/tangem/tap/features/details/ui/walletconnect/dialogs/BnbTransactionDialog.kt index 8de826231f..f39ae20dde 100644 --- a/app/src/main/java/com/tangem/tap/features/details/ui/walletconnect/dialogs/BnbTransactionDialog.kt +++ b/app/src/main/java/com/tangem/tap/features/details/ui/walletconnect/dialogs/BnbTransactionDialog.kt @@ -9,59 +9,57 @@ import com.tangem.tap.store import com.tangem.wallet.R import com.trustwallet.walletconnect.models.session.WCSession -class BnbTransactionDialog { - companion object { - fun create( - data: BinanceMessageData, - session: WCSession, - sessionId: Long, - dAppName: String, - context: Context, - ): AlertDialog { +object BnbTransactionDialog { + fun create( + data: BinanceMessageData, + session: WCSession, + sessionId: Long, + dAppName: String, + context: Context, + ): AlertDialog { - val message = when (data) { - is BinanceMessageData.Trade -> data.tradeData.map { - context.getString( - R.string.wallet_connect_bnb_trade_order_message, - it.symbol, - it.price, - it.quantity, - it.amount, - ) - }.joinToString(separator = "\n\n") - is BinanceMessageData.Transfer -> context.getString( - R.string.wallet_connect_bnb_transaction_message, - data.address, - data.outputAddress, - data.amount, + val message = when (data) { + is BinanceMessageData.Trade -> data.tradeData.map { + context.getString( + R.string.wallet_connect_bnb_trade_order_message, + it.symbol, + it.price, + it.quantity, + it.amount, + ) + }.joinToString(separator = "\n\n") + is BinanceMessageData.Transfer -> context.getString( + R.string.wallet_connect_bnb_transaction_message, + data.address, + data.outputAddress, + data.amount, + ) + } + + val fullMessage = context.getString( + R.string.wallet_connect_bnb_sign_message, + dAppName, message, + ) + val positiveButtonTitle = context.getText(R.string.common_sign) + + return AlertDialog.Builder(context).apply { + setTitle(context.getString(R.string.wallet_connect_title)) + setMessage(fullMessage) + setPositiveButton(positiveButtonTitle) { _, _ -> + store.dispatch( + WalletConnectAction.BinanceTransaction.Sign( + id = sessionId, + data = data.data, + sessionData = session, + ), ) } - - val fullMessage = context.getString( - R.string.wallet_connect_bnb_sign_message, - dAppName, message, - ) - val positiveButtonTitle = context.getText(R.string.common_sign) - - return AlertDialog.Builder(context).apply { - setTitle(context.getString(R.string.wallet_connect_title)) - setMessage(fullMessage) - setPositiveButton(positiveButtonTitle) { _, _ -> - store.dispatch( - WalletConnectAction.BinanceTransaction.Sign( - id = sessionId, - data = data.data, - sessionData = session, - ), - ) - } - setNegativeButton(context.getText(R.string.common_reject)) { _, _ -> - store.dispatch(WalletConnectAction.RejectRequest(session, sessionId)) - } - setOnDismissListener { - store.dispatch(GlobalAction.HideDialog) - } - }.create() - } + setNegativeButton(context.getText(R.string.common_reject)) { _, _ -> + store.dispatch(WalletConnectAction.RejectRequest(session, sessionId)) + } + setOnDismissListener { + store.dispatch(GlobalAction.HideDialog) + } + }.create() } } \ No newline at end of file diff --git a/app/src/main/java/com/tangem/tap/features/details/ui/walletconnect/dialogs/ClipboardOrScanQrDialog.kt b/app/src/main/java/com/tangem/tap/features/details/ui/walletconnect/dialogs/ClipboardOrScanQrDialog.kt index 0213971713..d1962be5e4 100644 --- a/app/src/main/java/com/tangem/tap/features/details/ui/walletconnect/dialogs/ClipboardOrScanQrDialog.kt +++ b/app/src/main/java/com/tangem/tap/features/details/ui/walletconnect/dialogs/ClipboardOrScanQrDialog.kt @@ -9,22 +9,20 @@ import com.tangem.tap.features.details.redux.walletconnect.WalletConnectAction import com.tangem.tap.store import com.tangem.wallet.R -class ClipboardOrScanQrDialog { - companion object { - fun create(wcUri: String, context: Context): AlertDialog { - return AlertDialog.Builder(context).apply { - setTitle(context.getString(R.string.wallet_connect_title)) - setMessage(context.getText(R.string.wallet_connect_clipboard_alert)) - setPositiveButton(context.getText(R.string.wallet_connect_paste_from_clipboard)) { _, _ -> - store.dispatch(WalletConnectAction.OpenSession(wcUri)) - } - setNegativeButton(context.getText(R.string.wallet_connect_scan_new_code)) { _, _ -> - store.dispatch(NavigationAction.NavigateTo(AppScreen.QrScan)) - } - setOnDismissListener { - store.dispatch(GlobalAction.HideDialog) - } - }.create() - } +object ClipboardOrScanQrDialog { + fun create(wcUri: String, context: Context): AlertDialog { + return AlertDialog.Builder(context).apply { + setTitle(context.getString(R.string.wallet_connect_title)) + setMessage(context.getText(R.string.wallet_connect_clipboard_alert)) + setPositiveButton(context.getText(R.string.wallet_connect_paste_from_clipboard)) { _, _ -> + store.dispatch(WalletConnectAction.OpenSession(wcUri)) + } + setNegativeButton(context.getText(R.string.wallet_connect_scan_new_code)) { _, _ -> + store.dispatch(NavigationAction.NavigateTo(AppScreen.QrScan)) + } + setOnDismissListener { + store.dispatch(GlobalAction.HideDialog) + } + }.create() } } \ No newline at end of file diff --git a/app/src/main/java/com/tangem/tap/features/details/ui/walletconnect/dialogs/PersonalSignDialog.kt b/app/src/main/java/com/tangem/tap/features/details/ui/walletconnect/dialogs/PersonalSignDialog.kt index c78549f273..5f6bf384ed 100644 --- a/app/src/main/java/com/tangem/tap/features/details/ui/walletconnect/dialogs/PersonalSignDialog.kt +++ b/app/src/main/java/com/tangem/tap/features/details/ui/walletconnect/dialogs/PersonalSignDialog.kt @@ -8,24 +8,22 @@ import com.tangem.tap.store import com.tangem.wallet.R import com.trustwallet.walletconnect.models.session.WCSession -class PersonalSignDialog { - companion object { - fun create(data: PersonalSignDialogData, context: Context): AlertDialog { - val message = context.getString(R.string.wallet_connect_alert_sign_message, data.message) - return AlertDialog.Builder(context).apply { - setTitle(context.getString(R.string.wallet_connect_title)) - setMessage(message) - setPositiveButton(context.getText(R.string.common_sign)) { _, _ -> - store.dispatch(WalletConnectAction.SignMessage(data.session)) - } - setNegativeButton(context.getText(R.string.common_reject)) { _, _ -> - store.dispatch(WalletConnectAction.RejectRequest(data.session, data.id)) - } - setOnDismissListener { - store.dispatch(GlobalAction.HideDialog) - } - }.create() - } +object PersonalSignDialog { + fun create(data: PersonalSignDialogData, context: Context): AlertDialog { + val message = context.getString(R.string.wallet_connect_alert_sign_message, data.message) + return AlertDialog.Builder(context).apply { + setTitle(context.getString(R.string.wallet_connect_title)) + setMessage(message) + setPositiveButton(context.getText(R.string.common_sign)) { _, _ -> + store.dispatch(WalletConnectAction.SignMessage(data.session)) + } + setNegativeButton(context.getText(R.string.common_reject)) { _, _ -> + store.dispatch(WalletConnectAction.RejectRequest(data.session, data.id)) + } + setOnDismissListener { + store.dispatch(GlobalAction.HideDialog) + } + }.create() } } diff --git a/app/src/main/java/com/tangem/tap/features/details/ui/walletconnect/dialogs/TransactionDialog.kt b/app/src/main/java/com/tangem/tap/features/details/ui/walletconnect/dialogs/TransactionDialog.kt index cd45c1c9be..4d502f7275 100644 --- a/app/src/main/java/com/tangem/tap/features/details/ui/walletconnect/dialogs/TransactionDialog.kt +++ b/app/src/main/java/com/tangem/tap/features/details/ui/walletconnect/dialogs/TransactionDialog.kt @@ -9,45 +9,40 @@ import com.tangem.tap.store import com.tangem.wallet.R import com.trustwallet.walletconnect.models.session.WCSession -class TransactionDialog { - companion object { - fun create( - data: TransactionRequestDialogData, - context: Context, - ): AlertDialog { - val message = context.getString( - R.string.wallet_connect_create_tx_message, - data.dAppName, - data.dAppUrl, - data.amount, - data.gasAmount, - data.totalAmount, - data.balance, - ) +object TransactionDialog { + fun create(data: TransactionRequestDialogData, context: Context): AlertDialog { + val message = context.getString( + R.string.wallet_connect_create_tx_message, + data.dAppName, + data.dAppUrl, + data.amount, + data.gasAmount, + data.totalAmount, + data.balance, + ) - val positiveButtonTitle = when (data.type) { - WcTransactionType.EthSignTransaction -> context.getText(R.string.common_sign) - WcTransactionType.EthSendTransaction -> context.getText(R.string.common_sign_and_send) - } - return AlertDialog.Builder(context).apply { - setTitle(context.getString(R.string.wallet_connect_title)) - setMessage(message) - setPositiveButton(positiveButtonTitle) { _, _ -> - if (data.isEnoughFundsToSend) { - store.dispatch(WalletConnectAction.SendTransaction(data.session)) - } else { - store.dispatch(WalletConnectAction.RejectRequest(data.session, data.id)) - store.dispatch(WalletConnectAction.NotEnoughFunds) - } - } - setNegativeButton(context.getText(R.string.common_reject)) { _, _ -> - store.dispatch(WalletConnectAction.RejectRequest(data.session, data.id)) - } - setOnDismissListener { - store.dispatch(GlobalAction.HideDialog) - } - }.create() + val positiveButtonTitle = when (data.type) { + WcTransactionType.EthSignTransaction -> context.getText(R.string.common_sign) + WcTransactionType.EthSendTransaction -> context.getText(R.string.common_sign_and_send) } + return AlertDialog.Builder(context).apply { + setTitle(context.getString(R.string.wallet_connect_title)) + setMessage(message) + setPositiveButton(positiveButtonTitle) { _, _ -> + if (data.isEnoughFundsToSend) { + store.dispatch(WalletConnectAction.SendTransaction(data.session)) + } else { + store.dispatch(WalletConnectAction.RejectRequest(data.session, data.id)) + store.dispatch(WalletConnectAction.NotEnoughFunds) + } + } + setNegativeButton(context.getText(R.string.common_reject)) { _, _ -> + store.dispatch(WalletConnectAction.RejectRequest(data.session, data.id)) + } + setOnDismissListener { + store.dispatch(GlobalAction.HideDialog) + } + }.create() } } diff --git a/app/src/main/java/com/tangem/tap/features/details/ui/walletconnect/dialogs/WcDialog.kt b/app/src/main/java/com/tangem/tap/features/details/ui/walletconnect/dialogs/WcDialog.kt deleted file mode 100644 index f71c14a348..0000000000 --- a/app/src/main/java/com/tangem/tap/features/details/ui/walletconnect/dialogs/WcDialog.kt +++ /dev/null @@ -1,55 +0,0 @@ -package com.tangem.tap.features.details.ui.walletconnect.dialogs - -import android.content.Context -import androidx.appcompat.app.AlertDialog - -class WcDialog { - companion object { - fun create(dialogData: DialogData, context: Context): AlertDialog { - return AlertDialog.Builder(context).apply { - setTitle(dialogData.title) - setMessage(dialogData.message) - setPositiveButton(dialogData.positiveButton.title) { _, _ -> - dialogData.positiveButton.action() - } - setNegativeButton(dialogData.negativeButton.title) { _, _ -> - dialogData.negativeButton.action() - } - setOnDismissListener { dialogData.onDismissAction() } - }.create() - } - } -} - -data class DialogData( - val title: String, - val message: String, - val positiveButton: ButtonData, - val negativeButton: ButtonData, - val onDismissAction: () -> Unit, -) - -data class ButtonData( - val title: String, - val action: () -> Unit, -) - -//class WcDialogMessageBuilder(val messageRes: Int, val data: DialogMessageData? = null) { -// fun build(context: Context): String { -// when (data) { -// null -> context.getString(messageRes) -// } -// } -//} - -interface DialogMessageData - -data class WcTransactionDialogMessageData( - val dAppName: String, - val dAppUrl: String, - val amount: String, - val gasAmount: String, - val totalAmount: String, - val balance: String, - val isEnoughFundsToSend: Boolean, -) \ No newline at end of file diff --git a/app/src/main/java/com/tangem/tap/features/disclaimer/Disclaimer.kt b/app/src/main/java/com/tangem/tap/features/disclaimer/Disclaimer.kt index 1f72592557..27dd88ee13 100644 --- a/app/src/main/java/com/tangem/tap/features/disclaimer/Disclaimer.kt +++ b/app/src/main/java/com/tangem/tap/features/disclaimer/Disclaimer.kt @@ -51,6 +51,7 @@ class Start2CoinDisclaimer(dataProvider: DisclaimerDataProvider) : BaseDisclaime override fun getUri(): Uri = Uri.parse("$baseUrl/" + filename(dataProvider.getLanguage(), getRegion())) override fun getPreferenceKey(): String = "start2Coin_tos_accepted_${getRegion()}" + @Suppress("ComplexMethod") private fun filename(languageCode: String, regionCode: String?): String { return when { languageCode == "fr" && regionCode == "ch" -> "start2coin-fr-ch-tangem.html" diff --git a/app/src/main/java/com/tangem/tap/features/disclaimer/redux/DisclaimerReducer.kt b/app/src/main/java/com/tangem/tap/features/disclaimer/redux/DisclaimerReducer.kt index 456818fe70..bef592e97e 100644 --- a/app/src/main/java/com/tangem/tap/features/disclaimer/redux/DisclaimerReducer.kt +++ b/app/src/main/java/com/tangem/tap/features/disclaimer/redux/DisclaimerReducer.kt @@ -3,10 +3,8 @@ package com.tangem.tap.features.disclaimer.redux import com.tangem.tap.common.redux.AppState import org.rekotlin.Action -class DisclaimerReducer { - companion object { - fun reduce(action: Action, state: AppState): DisclaimerState = internalReduce(action, state) - } +object DisclaimerReducer { + fun reduce(action: Action, state: AppState): DisclaimerState = internalReduce(action, state) } private fun internalReduce(action: Action, state: AppState): DisclaimerState { diff --git a/app/src/main/java/com/tangem/tap/features/disclaimer/redux/DisclaimerState.kt b/app/src/main/java/com/tangem/tap/features/disclaimer/redux/DisclaimerState.kt index 99db90b3d8..b610475974 100644 --- a/app/src/main/java/com/tangem/tap/features/disclaimer/redux/DisclaimerState.kt +++ b/app/src/main/java/com/tangem/tap/features/disclaimer/redux/DisclaimerState.kt @@ -12,8 +12,7 @@ data class DisclaimerState( val showedFromScreen: AppScreen = AppScreen.Home, val callback: DisclaimerCallback? = null, val progressState: ProgressState? = null, -) : StateType { -} +) : StateType data class DisclaimerCallback( val onAccept: VoidCallback? = null, diff --git a/app/src/main/java/com/tangem/tap/features/disclaimer/ui/DisclaimerFragment.kt b/app/src/main/java/com/tangem/tap/features/disclaimer/ui/DisclaimerFragment.kt index 506b8beae9..e19be8e926 100644 --- a/app/src/main/java/com/tangem/tap/features/disclaimer/ui/DisclaimerFragment.kt +++ b/app/src/main/java/com/tangem/tap/features/disclaimer/ui/DisclaimerFragment.kt @@ -5,7 +5,6 @@ import android.view.View import androidx.transition.TransitionInflater import by.kirich1409.viewbindingdelegate.viewBinding import com.tangem.core.ui.fragments.setStatusBarColor -import com.tangem.tap.common.extensions.configureSettings import com.tangem.tap.common.extensions.beginDelayedTransition import com.tangem.tap.common.extensions.hide import com.tangem.tap.common.extensions.show diff --git a/app/src/main/java/com/tangem/tap/features/disclaimer/ui/DisclaimerWebViewClient.kt b/app/src/main/java/com/tangem/tap/features/disclaimer/ui/DisclaimerWebViewClient.kt index c1a024fc0c..4e07832feb 100644 --- a/app/src/main/java/com/tangem/tap/features/disclaimer/ui/DisclaimerWebViewClient.kt +++ b/app/src/main/java/com/tangem/tap/features/disclaimer/ui/DisclaimerWebViewClient.kt @@ -59,10 +59,14 @@ class DisclaimerWebViewClient : WebViewClient() { super.onReceivedHttpError(view, resourceRequest, errorResponse) ifNotNull(resourceRequest, errorResponse) { request, response -> - if (request.url?.toString() != loadingUrl || response.statusCode < 400) return + if (request.url?.toString() != loadingUrl || response.statusCode < RESPONSE_USER_ERROR_STATUS_CODE) return if (progressState != ProgressState.Done) return progressState = ProgressState.Error } } + + companion object { + private const val RESPONSE_USER_ERROR_STATUS_CODE = 400 + } } \ No newline at end of file diff --git a/app/src/main/java/com/tangem/tap/features/feedback/FeedbackManager.kt b/app/src/main/java/com/tangem/tap/features/feedback/FeedbackManager.kt deleted file mode 100644 index e69de29bb2..0000000000 diff --git a/app/src/main/java/com/tangem/tap/features/home/compose/StoriesAnimation.kt b/app/src/main/java/com/tangem/tap/features/home/compose/StoriesAnimation.kt index 58f9356349..76ef1a643e 100644 --- a/app/src/main/java/com/tangem/tap/features/home/compose/StoriesAnimation.kt +++ b/app/src/main/java/com/tangem/tap/features/home/compose/StoriesAnimation.kt @@ -22,6 +22,9 @@ import androidx.compose.ui.unit.dp import com.tangem.tap.common.compose.extensions.AnimatedValue import com.tangem.tap.common.compose.extensions.toAnimatable +private const val SCALE_SWITCH_BARRIER = 1.15f + +@Suppress("LongParameterList") @Composable fun HorizontalSlidingImage( painter: Painter, @@ -39,7 +42,7 @@ fun HorizontalSlidingImage( .requiredWidth(itemSize.width) .requiredHeight(itemSize.height) .graphicsLayer( - translationX = translateX.toAnimatable(isPaused = paused, duration = duration).value + translationX = translateX.toAnimatable(isPaused = paused, duration = duration).value, ), alignment = Alignment.TopStart, contentScale = ContentScale.FillBounds, @@ -54,7 +57,7 @@ fun StoriesTextAnimation( slideInDelay: Int = 200, slideDistance: Dp = 60.dp, label: String = "", - content: @Composable (Modifier) -> Unit + content: @Composable (Modifier) -> Unit, ) { val isLaunched = remember { mutableStateOf(false) } val transition = updateTransition(targetState = isLaunched.value, label = label) @@ -64,10 +67,10 @@ fun StoriesTextAnimation( tween( durationMillis = slideInDuration, delayMillis = slideInDelay, - easing = FastOutSlowInEasing + easing = FastOutSlowInEasing, ) }, - label = "Slide in" + label = "Slide in", ) { value -> if (value) 0.dp else slideDistance } val alpha = transition.animateFloat( @@ -75,16 +78,16 @@ fun StoriesTextAnimation( tween( durationMillis = slideInDuration * 2, delayMillis = slideInDelay, - easing = FastOutSlowInEasing + easing = FastOutSlowInEasing, ) }, - label = "Visibility" + label = "Visibility", ) { value -> if (value) 1f else 0f } content( Modifier .absoluteOffset(y = offsetY.value) - .alpha(alpha.value) + .alpha(alpha.value), ) LaunchedEffect(Unit) { isLaunched.value = true } @@ -95,9 +98,8 @@ fun StoriesBottomImageAnimation( initialScale: Float = 2.5f, firstStepDuration: Int, totalDuration: Int, - content: @Composable (Modifier) -> Unit + content: @Composable (Modifier) -> Unit, ) { - val scaleSwitchBarrier = 1.15f val secondStepDuration = totalDuration - firstStepDuration val isFirstStepLaunched = remember { mutableStateOf(false) } @@ -105,7 +107,7 @@ fun StoriesBottomImageAnimation( val firstTransition = updateTransition( targetState = isFirstStepLaunched.value, - label = "Image appearing" + label = "Image appearing", ) val firstScaleStep = firstTransition.animateFloat( transitionSpec = { @@ -114,12 +116,12 @@ fun StoriesBottomImageAnimation( easing = FastOutLinearInEasing, ) }, - label = "Appearing scale" - ) { value -> if (value) scaleSwitchBarrier else initialScale } + label = "Appearing scale", + ) { value -> if (value) SCALE_SWITCH_BARRIER else initialScale } val secondTransition = updateTransition( targetState = isSecondStepLaunched.value, - label = "Image slow outgoing" + label = "Image slow outgoing", ) val secondScaleStep = secondTransition.animateFloat( transitionSpec = { @@ -128,15 +130,15 @@ fun StoriesBottomImageAnimation( easing = LinearEasing, ) }, - label = "Outgoing scale" - ) { value -> if (value) 1f else scaleSwitchBarrier } + label = "Outgoing scale", + ) { value -> if (value) 1f else SCALE_SWITCH_BARRIER } val fadeIn = firstTransition.animateFloat( transitionSpec = { tween(durationMillis = 400) }, - label = "Fade in on start" + label = "Fade in on start", ) { value -> if (value) 1f else 0f } - if (firstScaleStep.value == scaleSwitchBarrier) { + if (firstScaleStep.value == SCALE_SWITCH_BARRIER) { isSecondStepLaunched.value = true } diff --git a/app/src/main/java/com/tangem/tap/features/home/compose/StoriesScreen.kt b/app/src/main/java/com/tangem/tap/features/home/compose/StoriesScreen.kt index a459a4d701..2add8bf97a 100644 --- a/app/src/main/java/com/tangem/tap/features/home/compose/StoriesScreen.kt +++ b/app/src/main/java/com/tangem/tap/features/home/compose/StoriesScreen.kt @@ -1,3 +1,5 @@ +@file:Suppress("MagicNumber") + package com.tangem.tap.features.home.compose import androidx.compose.foundation.Image @@ -52,6 +54,9 @@ import com.tangem.tap.features.home.redux.HomeState import com.tangem.wallet.R import kotlin.math.max +private const val STEPS = 6 + +@Suppress("LongMethod", "ComplexMethod") @Composable fun StoriesScreen( homeState: MutableState = mutableStateOf(HomeState()), @@ -59,7 +64,6 @@ fun StoriesScreen( onShopButtonClick: () -> Unit, onSearchTokensClick: () -> Unit, ) { - val steps = 6 val currentStep = remember { mutableStateOf(1) } val systemUiController = rememberSystemUiController() @@ -69,7 +73,7 @@ fun StoriesScreen( currentStep.value = max(1, currentStep.value - 1) } val goToNextScreen = { - currentStep.value = if (currentStep.value < steps) currentStep.value + 1 else 1 + currentStep.value = if (currentStep.value < STEPS) currentStep.value + 1 else 1 } val isPressed = remember { mutableStateOf(false) } @@ -149,7 +153,7 @@ fun StoriesScreen( verticalArrangement = Arrangement.Center, ) { StoriesProgressBar( - steps = steps, + steps = STEPS, currentStep = currentStep.value, stepDuration = currentStep.duration(), paused = isPaused, @@ -181,27 +185,29 @@ fun StoriesScreen( .align(Alignment.BottomCenter) .fillMaxWidth(), ) { - if (currentStep.value == 4) Button( - onClick = onSearchTokensClick, - modifier = Modifier - .fillMaxWidth() - .padding(start = 16.dp, end = 16.dp, bottom = 16.dp) - .height(48.dp), - colors = ButtonDefaults.textButtonColors( - backgroundColor = Color.White, - contentColor = Color(0xFF080C10), - ), - ) { - Image( - painter = painterResource(id = R.drawable.ic_search), - contentDescription = null, - ) - Text( - text = stringResource(id = R.string.search_tokens_title), - fontWeight = FontWeight.Medium, - fontSize = 16.sp, - textAlign = TextAlign.Center, - ) + if (currentStep.value == 4) { + Button( + onClick = onSearchTokensClick, + modifier = Modifier + .fillMaxWidth() + .padding(start = 16.dp, end = 16.dp, bottom = 16.dp) + .height(48.dp), + colors = ButtonDefaults.textButtonColors( + backgroundColor = Color.White, + contentColor = Color(0xFF080C10), + ), + ) { + Image( + painter = painterResource(id = R.drawable.ic_search), + contentDescription = null, + ) + Text( + text = stringResource(id = R.string.search_tokens_title), + fontWeight = FontWeight.Medium, + fontSize = 16.sp, + textAlign = TextAlign.Center, + ) + } } HomeButtons( modifier = Modifier @@ -216,6 +222,7 @@ fun StoriesScreen( } } +@Suppress("MagicNumber") private fun MutableState.duration(): Int = when (this.value) { 1 -> 8000 else -> 6000 diff --git a/app/src/main/java/com/tangem/tap/features/home/compose/content/Content.kt b/app/src/main/java/com/tangem/tap/features/home/compose/content/Content.kt index e8a6b447f7..5ff3317d22 100644 --- a/app/src/main/java/com/tangem/tap/features/home/compose/content/Content.kt +++ b/app/src/main/java/com/tangem/tap/features/home/compose/content/Content.kt @@ -51,7 +51,7 @@ fun StoriesRevolutionaryWallet(stepDuration: Int) { isDarkBackground = true, ) } - } + }, ) } @@ -76,7 +76,7 @@ fun StoriesUltraSecureBackup(isPaused: Boolean, stepDuration: Int) { }, bottomContent = { FloatingCardsContent(isPaused, stepDuration) - } + }, ) } @@ -92,7 +92,7 @@ fun StoriesCurrencies(isPaused: Boolean, stepDuration: Int) { }, bottomContent = { StoriesCurrenciesContent(paused = isPaused, duration = stepDuration) - } + }, ) } @@ -108,7 +108,7 @@ fun StoriesWeb3(isPaused: Boolean, stepDuration: Int) { }, bottomContent = { StoriesWeb3Content(paused = isPaused, duration = stepDuration) - } + }, ) } @@ -133,7 +133,7 @@ fun StoriesWalletForEveryone(stepDuration: Int) { isDarkBackground = true, ) } - } + }, ) } @@ -146,7 +146,7 @@ private fun SplitContent( modifier = Modifier .fillMaxSize(), horizontalAlignment = Alignment.CenterHorizontally, - verticalArrangement = Arrangement.Top + verticalArrangement = Arrangement.Top, ) { topContent() bottomContent() @@ -171,6 +171,7 @@ private fun TopContent( SpacerH32() } +@Suppress("MagicNumber") @Composable private fun StoriesTitleText( text: String, @@ -187,15 +188,14 @@ private fun StoriesTitleText( fontSize = 32.sp, fontWeight = FontWeight.SemiBold, color = if (isDarkBackground) Color.White else Color(0xFF090E13), - textAlign = TextAlign.Center + textAlign = TextAlign.Center, ) } } +@Suppress("MagicNumber") @Composable -private fun StoriesSubtitleText( - subtitleText: AnnotatedString, -) { +private fun StoriesSubtitleText(subtitleText: AnnotatedString) { val color = Color(0xFFA6AAAD) StoriesTextAnimation( @@ -209,7 +209,7 @@ private fun StoriesSubtitleText( text = subtitleText, fontSize = 20.sp, color = color, - textAlign = TextAlign.Center + textAlign = TextAlign.Center, ) } } @@ -224,7 +224,7 @@ private fun StoriesImage( painter = painterResource(id = drawableResId), contentDescription = null, contentScale = if (isDarkBackground) ContentScale.Inside else ContentScale.FillWidth, - modifier = modifier.fillMaxWidth() + modifier = modifier.fillMaxWidth(), ) } @@ -233,7 +233,6 @@ private fun String.annotated(): AnnotatedString { return buildAnnotatedString { append(source) } } - @Preview @Composable private fun RevolutionaryWalletPreview() { @@ -252,14 +251,12 @@ private fun CurrenciesPreview() { StoriesCurrencies(false, 6000) } - @Preview @Composable private fun Web3Preview() { StoriesWeb3(false, 6000) } - @Preview @Composable private fun WalletForEveryonePreview() { diff --git a/app/src/main/java/com/tangem/tap/features/home/compose/content/CurrenciesWeb3Content.kt b/app/src/main/java/com/tangem/tap/features/home/compose/content/CurrenciesWeb3Content.kt index 85ec581b07..0f4bae7cff 100644 --- a/app/src/main/java/com/tangem/tap/features/home/compose/content/CurrenciesWeb3Content.kt +++ b/app/src/main/java/com/tangem/tap/features/home/compose/content/CurrenciesWeb3Content.kt @@ -53,7 +53,7 @@ fun StoriesCurrenciesContent( val chessOffset = if (index.isEven()) 0.dp else scaledItemSize.halfHeight() val animateFrom = chessOffset - moveItemToStartOfScreen - val animateTo = 50.dp - (50.dp * index * decreaseRate) + val animateTo = 50.dp - 50.dp * index * decreaseRate HorizontalSlidingImage( paused = paused, @@ -70,6 +70,7 @@ fun StoriesCurrenciesContent( } } +@Suppress("MagicNumber") @Composable fun StoriesWeb3Content( paused: Boolean, @@ -99,7 +100,7 @@ fun StoriesWeb3Content( val chessOffset = if (index.isEven()) 0.dp else scaledItemSize.width / 3 val animateFrom = chessOffset - moveItemToStartOfScreen - val animateTo = 70.dp - (70.dp * index * decreaseRate) + val animateTo = 70.dp - 70.dp * index * decreaseRate HorizontalSlidingImage( paused = paused, diff --git a/app/src/main/java/com/tangem/tap/features/home/compose/content/FirstStoriesContent.kt b/app/src/main/java/com/tangem/tap/features/home/compose/content/FirstStoriesContent.kt index 393642f976..3a7b6da393 100644 --- a/app/src/main/java/com/tangem/tap/features/home/compose/content/FirstStoriesContent.kt +++ b/app/src/main/java/com/tangem/tap/features/home/compose/content/FirstStoriesContent.kt @@ -5,8 +5,17 @@ import androidx.compose.animation.core.Animatable import androidx.compose.animation.core.LinearEasing import androidx.compose.animation.core.tween import androidx.compose.foundation.Image -import androidx.compose.foundation.layout.* -import androidx.compose.runtime.* +import androidx.compose.foundation.layout.Box +import androidx.compose.foundation.layout.Column +import androidx.compose.foundation.layout.fillMaxSize +import androidx.compose.foundation.layout.fillMaxWidth +import androidx.compose.foundation.layout.padding +import androidx.compose.foundation.layout.wrapContentSize +import androidx.compose.runtime.Composable +import androidx.compose.runtime.LaunchedEffect +import androidx.compose.runtime.MutableState +import androidx.compose.runtime.mutableStateOf +import androidx.compose.runtime.remember import androidx.compose.ui.Alignment import androidx.compose.ui.Modifier import androidx.compose.ui.draw.alpha @@ -25,10 +34,11 @@ import com.tangem.tap.features.home.compose.StoriesBottomImageAnimation import com.tangem.tap.features.home.compose.StoriesTextAnimation import com.tangem.wallet.R +@Suppress("LongMethod", "ComplexMethod", "MagicNumber") @Composable fun FirstStoriesContent( isPaused: Boolean, duration: Int = 8_000, - hideContent: (Boolean) -> Unit + hideContent: (Boolean) -> Unit, ) { val screenState = remember { mutableStateOf(StartingScreenState.INIT) } val progress = remember { Animatable(0f) } @@ -41,8 +51,8 @@ fun FirstStoriesContent( targetValue = 2f, animationSpec = tween( durationMillis = duration, - easing = LinearEasing - ) + easing = LinearEasing, + ), ) } } @@ -80,7 +90,7 @@ fun FirstStoriesContent( .padding(start = 20.dp, end = 20.dp, bottom = 100.dp), text = textId?.let { stringResource(textId) } ?: "", textStyle = style, - fontSizeRange = FontSizeRange(20.sp, 60.sp) + fontSizeRange = FontSizeRange(20.sp, 60.sp), ) } else { Column( @@ -88,7 +98,7 @@ fun FirstStoriesContent( ) { Box( modifier = Modifier - .weight(0.7f) + .weight(0.7f), ) { if (screenState.isMeetTangemDisplaying()) { StoriesTextAnimation( @@ -100,10 +110,9 @@ fun FirstStoriesContent( .alpha(if (screenState.value == StartingScreenState.SHOW_CARD) 0f else 1f), text = textId?.let { stringResource(textId) } ?: "", textStyle = style, - fontSizeRange = FontSizeRange(30.sp, 50.sp) + fontSizeRange = FontSizeRange(30.sp, 50.sp), ) } - } } Box( @@ -155,7 +164,6 @@ private fun MutableState.isMeetTangemDisplaying(): Boolean return this.value == StartingScreenState.MEET_TANGEM } - @Preview @Composable fun FirstStoriesPreview() { diff --git a/app/src/main/java/com/tangem/tap/features/home/compose/content/FloatingCardsContent.kt b/app/src/main/java/com/tangem/tap/features/home/compose/content/FloatingCardsContent.kt index 8528982857..16e9044852 100644 --- a/app/src/main/java/com/tangem/tap/features/home/compose/content/FloatingCardsContent.kt +++ b/app/src/main/java/com/tangem/tap/features/home/compose/content/FloatingCardsContent.kt @@ -26,7 +26,7 @@ fun FloatingCardsContent( FloatingCard.second(), FloatingCard.third(), ) - Box() { + Box { cards.forEach { floatingCard -> FloatingCard.Item( isPaused = isPaused, @@ -47,57 +47,58 @@ private data class CardValues( val scale: AnimatedValue = AnimatedValue(1f, 1f), ) -private class FloatingCard { - companion object { +private object FloatingCard { - @Composable - fun Item( - isPaused: Boolean, - stepDuration: Int, - imageBitmap: ImageBitmap, - cardValues: CardValues, - ) { - Image( - bitmap = imageBitmap, - contentDescription = "Floating Tangem card", - modifier = Modifier - .graphicsLayer( - translationX = cardValues.translateX.toAnimatable(isPaused, stepDuration).value, - translationY = cardValues.translateY.toAnimatable(isPaused, stepDuration).value, - rotationX = cardValues.rotationX.toAnimatable(isPaused, stepDuration).value, - rotationY = cardValues.rotationY.toAnimatable(isPaused, stepDuration).value, - rotationZ = cardValues.rotationZ.toAnimatable(isPaused, stepDuration).value, - scaleX = cardValues.scale.toAnimatable(isPaused, stepDuration).value, - scaleY = cardValues.scale.toAnimatable(isPaused, stepDuration).value, - ), - ) - } - - fun first(): CardValues = CardValues( - translateX = -400f to -350f, - translateY = 30f to 32f, - rotationX = 10f to 15f, - rotationY = 15f to 15f, - rotationZ = 40f to 27f, - scale = 0.6f to 0.6f, - ) - - fun second(): CardValues = CardValues( - translateX = 350f to 300f, - translateY = -70f to 0f, - rotationX = 30f to 48f, - rotationY = 0f to 5f, - rotationZ = -34f to -42f, - scale = 0.47f to 0.35f, - ) - - fun third(): CardValues = CardValues( - translateX = 320f to 250f, - translateY = 500f to 500f, - rotationX = 0f to 3f, - rotationY = 10f to 10f, - rotationZ = -45f to -30f, - scale = 0.6f to 0.75f, + @Composable + fun Item( + isPaused: Boolean, + stepDuration: Int, + imageBitmap: ImageBitmap, + cardValues: CardValues, + ) { + Image( + bitmap = imageBitmap, + contentDescription = "Floating Tangem card", + modifier = Modifier + .graphicsLayer( + translationX = cardValues.translateX.toAnimatable(isPaused, stepDuration).value, + translationY = cardValues.translateY.toAnimatable(isPaused, stepDuration).value, + rotationX = cardValues.rotationX.toAnimatable(isPaused, stepDuration).value, + rotationY = cardValues.rotationY.toAnimatable(isPaused, stepDuration).value, + rotationZ = cardValues.rotationZ.toAnimatable(isPaused, stepDuration).value, + scaleX = cardValues.scale.toAnimatable(isPaused, stepDuration).value, + scaleY = cardValues.scale.toAnimatable(isPaused, stepDuration).value, + ), ) } + + @Suppress("MagicNumber") + fun first(): CardValues = CardValues( + translateX = -400f to -350f, + translateY = 30f to 32f, + rotationX = 10f to 15f, + rotationY = 15f to 15f, + rotationZ = 40f to 27f, + scale = 0.6f to 0.6f, + ) + + @Suppress("MagicNumber") + fun second(): CardValues = CardValues( + translateX = 350f to 300f, + translateY = -70f to 0f, + rotationX = 30f to 48f, + rotationY = 0f to 5f, + rotationZ = -34f to -42f, + scale = 0.47f to 0.35f, + ) + + @Suppress("MagicNumber") + fun third(): CardValues = CardValues( + translateX = 320f to 250f, + translateY = 500f to 500f, + rotationX = 0f to 3f, + rotationY = 10f to 10f, + rotationZ = -45f to -30f, + scale = 0.6f to 0.75f, + ) } \ No newline at end of file diff --git a/app/src/main/java/com/tangem/tap/features/home/compose/views/HomeButtons.kt b/app/src/main/java/com/tangem/tap/features/home/compose/views/HomeButtons.kt index cea593e6fe..5779309916 100644 --- a/app/src/main/java/com/tangem/tap/features/home/compose/views/HomeButtons.kt +++ b/app/src/main/java/com/tangem/tap/features/home/compose/views/HomeButtons.kt @@ -19,6 +19,7 @@ import androidx.compose.ui.unit.sp import com.tangem.core.ui.components.SpacerS8 import com.tangem.wallet.R +@Suppress("MagicNumber") @Composable fun HomeButtons( modifier: Modifier = Modifier, @@ -82,6 +83,7 @@ fun HomeButtons( } } +@Suppress("LongParameterList") @Composable fun ProgressButton( modifier: Modifier, diff --git a/app/src/main/java/com/tangem/tap/features/home/redux/HomeMiddleware.kt b/app/src/main/java/com/tangem/tap/features/home/redux/HomeMiddleware.kt index 167b7ec607..0e98babe31 100644 --- a/app/src/main/java/com/tangem/tap/features/home/redux/HomeMiddleware.kt +++ b/app/src/main/java/com/tangem/tap/features/home/redux/HomeMiddleware.kt @@ -17,7 +17,7 @@ import com.tangem.tap.domain.model.builders.UserWalletBuilder import com.tangem.tap.domain.scanCard.ScanCardProcessor import com.tangem.tap.features.home.BELARUS_COUNTRY_CODE import com.tangem.tap.features.home.RUSSIA_COUNTRY_CODE -import com.tangem.tap.features.home.redux.HomeMiddleware.Companion.BUY_WALLET_URL +import com.tangem.tap.features.home.redux.HomeMiddleware.BUY_WALLET_URL import com.tangem.tap.features.send.redux.states.ButtonState import com.tangem.tap.preferencesStorage import com.tangem.tap.scope @@ -30,12 +30,10 @@ import org.rekotlin.Action import org.rekotlin.Middleware import timber.log.Timber -class HomeMiddleware { - companion object { - val handler = homeMiddleware +object HomeMiddleware { + val handler = homeMiddleware - const val BUY_WALLET_URL = "https://tangem.com/ru/resellers/" - } + const val BUY_WALLET_URL = "https://tangem.com/ru/resellers/" } private val homeMiddleware: Middleware = { _, _ -> @@ -57,7 +55,7 @@ private fun handleHomeAction(action: Action) { is HomeAction.ShouldScanCardOnResume -> { if (action.shouldScanCard) { store.dispatch(HomeAction.ShouldScanCardOnResume(false)) - postUiDelayBg(700) { store.dispatch(HomeAction.ReadCard) } + postUiDelayBg(ms = 700) { store.dispatch(HomeAction.ReadCard) } } } is HomeAction.ReadCard -> readCard() @@ -94,18 +92,15 @@ private fun readCard() = scope.launch { scope.launch { if (preferencesStorage.shouldSaveUserWallets) { val userWallet = UserWalletBuilder(scanResponse).build() ?: return@launch - userWalletsListManager.save(userWallet) - .doOnFailure { error -> - Timber.e(error, "Unable to save user wallet") - store.onCardScanned(scanResponse) - } - .doOnSuccess { - scope.launch { store.onUserWalletSelected(userWallet) } - } - .doOnResult { - changeButtonState(ButtonState.ENABLED) - store.dispatchOnMain(NavigationAction.NavigateTo(AppScreen.Wallet)) - } + userWalletsListManager.save(userWallet).doOnFailure { error -> + Timber.e(error, "Unable to save user wallet") + store.onCardScanned(scanResponse) + }.doOnSuccess { + scope.launch { store.onUserWalletSelected(userWallet) } + }.doOnResult { + changeButtonState(ButtonState.ENABLED) + store.dispatchOnMain(NavigationAction.NavigateTo(AppScreen.Wallet)) + } } else { store.onCardScanned(scanResponse) changeButtonState(ButtonState.ENABLED) diff --git a/app/src/main/java/com/tangem/tap/features/home/redux/HomeReducer.kt b/app/src/main/java/com/tangem/tap/features/home/redux/HomeReducer.kt index e731e02945..a398a92c9c 100644 --- a/app/src/main/java/com/tangem/tap/features/home/redux/HomeReducer.kt +++ b/app/src/main/java/com/tangem/tap/features/home/redux/HomeReducer.kt @@ -3,10 +3,8 @@ package com.tangem.tap.features.home.redux import com.tangem.tap.common.redux.AppState import org.rekotlin.Action -class HomeReducer { - companion object { - fun reduce(action: Action, state: AppState): HomeState = internalReduce(action, state) - } +object HomeReducer { + fun reduce(action: Action, state: AppState): HomeState = internalReduce(action, state) } private fun internalReduce(action: Action, state: AppState): HomeState { diff --git a/app/src/main/java/com/tangem/tap/features/onboarding/OnboardingHelper.kt b/app/src/main/java/com/tangem/tap/features/onboarding/OnboardingHelper.kt index cb01879840..a92129dbd9 100644 --- a/app/src/main/java/com/tangem/tap/features/onboarding/OnboardingHelper.kt +++ b/app/src/main/java/com/tangem/tap/features/onboarding/OnboardingHelper.kt @@ -17,82 +17,79 @@ import kotlinx.coroutines.launch /** [REDACTED_AUTHOR] */ -class OnboardingHelper { - companion object { - - fun isOnboardingCase(response: ScanResponse): Boolean { - val cardInfoStorage = preferencesStorage.usedCardsPrefStorage - val cardId = response.card.cardId - return when { - response.isTangemTwins() -> { - if (!response.twinsIsTwinned()) { - true - } else { - cardInfoStorage.isActivationInProgress(cardId) - } - } - response.card.wallets.isNotEmpty() -> cardInfoStorage.isActivationInProgress(cardId) - else -> true - } - } - - fun whereToNavigate(scanResponse: ScanResponse): AppScreen { - return when (scanResponse.productType) { - ProductType.Note -> AppScreen.OnboardingNote - ProductType.Wallet -> if (scanResponse.card.settings.isBackupAllowed) { - AppScreen.OnboardingWallet +object OnboardingHelper { + fun isOnboardingCase(response: ScanResponse): Boolean { + val cardInfoStorage = preferencesStorage.usedCardsPrefStorage + val cardId = response.card.cardId + return when { + response.isTangemTwins() -> { + if (!response.twinsIsTwinned()) { + true } else { - AppScreen.OnboardingOther - } - ProductType.Twins -> AppScreen.OnboardingTwins - ProductType.SaltPay -> AppScreen.OnboardingWallet - ProductType.Start2Coin -> throw java.lang.UnsupportedOperationException( - "Onboarding for Start2Coin cards is not supported" - ) - } - } - - fun trySaveWalletAndNavigateToWalletScreen( - scanResponse: ScanResponse, - accessCode: String? = null, - backupCardsIds: List? = null, - ) { - when { - // When should save user wallets, then save card without navigate to save wallet screen - preferencesStorage.shouldSaveUserWallets -> scope.launch { - store.dispatchOnMain( - SaveWalletAction.ProvideBackupInfo( - scanResponse = scanResponse, - accessCode = accessCode, - backupCardsIds = backupCardsIds?.toSet(), - ), - ) - store.dispatchOnMain(SaveWalletAction.Save) - } - // When should not save user wallets but device has biometry and save wallet screen has not been shown, - // then open save wallet screen - tangemSdkManager.canUseBiometry && - preferencesStorage.shouldShowSaveUserWalletScreen -> scope.launch { - store.onCardScanned(scanResponse) - - delay(timeMillis = 1_200) - - store.dispatchOnMain( - SaveWalletAction.ProvideBackupInfo( - scanResponse = scanResponse, - accessCode = accessCode, - backupCardsIds = backupCardsIds?.toSet(), - ), - ) - store.dispatchOnMain(NavigationAction.NavigateTo(AppScreen.SaveWallet)) - } - // If device has no biometry and save wallet screen has been shown, then go through old scenario - else -> scope.launch { - store.onCardScanned(scanResponse) + cardInfoStorage.isActivationInProgress(cardId) } } - - store.dispatchOnMain(NavigationAction.NavigateTo(AppScreen.Wallet)) + response.card.wallets.isNotEmpty() -> cardInfoStorage.isActivationInProgress(cardId) + else -> true } } + + fun whereToNavigate(scanResponse: ScanResponse): AppScreen { + return when (scanResponse.productType) { + ProductType.Note -> AppScreen.OnboardingNote + ProductType.Wallet -> if (scanResponse.card.settings.isBackupAllowed) { + AppScreen.OnboardingWallet + } else { + AppScreen.OnboardingOther + } + ProductType.Twins -> AppScreen.OnboardingTwins + ProductType.SaltPay -> AppScreen.OnboardingWallet + ProductType.Start2Coin -> throw java.lang.UnsupportedOperationException( + "Onboarding for Start2Coin cards is not supported", + ) + } + } + + fun trySaveWalletAndNavigateToWalletScreen( + scanResponse: ScanResponse, + accessCode: String? = null, + backupCardsIds: List? = null, + ) { + when { + // When should save user wallets, then save card without navigate to save wallet screen + preferencesStorage.shouldSaveUserWallets -> scope.launch { + store.dispatchOnMain( + SaveWalletAction.ProvideBackupInfo( + scanResponse = scanResponse, + accessCode = accessCode, + backupCardsIds = backupCardsIds?.toSet(), + ), + ) + store.dispatchOnMain(SaveWalletAction.Save) + } + // When should not save user wallets but device has biometry and save wallet screen has not been shown, + // then open save wallet screen + tangemSdkManager.canUseBiometry && + preferencesStorage.shouldShowSaveUserWalletScreen -> scope.launch { + store.onCardScanned(scanResponse) + + delay(timeMillis = 1_200) + + store.dispatchOnMain( + SaveWalletAction.ProvideBackupInfo( + scanResponse = scanResponse, + accessCode = accessCode, + backupCardsIds = backupCardsIds?.toSet(), + ), + ) + store.dispatchOnMain(NavigationAction.NavigateTo(AppScreen.SaveWallet)) + } + // If device has no biometry and save wallet screen has been shown, then go through old scenario + else -> scope.launch { + store.onCardScanned(scanResponse) + } + } + + store.dispatchOnMain(NavigationAction.NavigateTo(AppScreen.Wallet)) + } } \ No newline at end of file diff --git a/app/src/main/java/com/tangem/tap/features/onboarding/OnboardingManager.kt b/app/src/main/java/com/tangem/tap/features/onboarding/OnboardingManager.kt index 853044464b..dcc026a041 100644 --- a/app/src/main/java/com/tangem/tap/features/onboarding/OnboardingManager.kt +++ b/app/src/main/java/com/tangem/tap/features/onboarding/OnboardingManager.kt @@ -55,7 +55,7 @@ class OnboardingManager( } } is Result.Failure -> { - val error = (result.error as? TapError) ?: TapError.UnknownError + val error = result.error as? TapError ?: TapError.UnknownError when (error) { is TapError.WalletManager.NoAccountError -> OnboardingWalletBalance.error(error) // NoInternetConnection, WalletManager.InternalError @@ -100,11 +100,11 @@ data class OnboardingWalletBalance( val criticalError: TapError? = null, ) { - fun balanceIsToppedUp(): Boolean = value.isPositive() || hasIncomingTransaction - val amountToCreateAccount: String? get() = if (error is TapError.WalletManager.NoAccountError) error.customMessage else null + fun balanceIsToppedUp(): Boolean = value.isPositive() || hasIncomingTransaction + companion object { fun error(error: TapError): OnboardingWalletBalance = OnboardingWalletBalance( state = ProgressState.Error, diff --git a/app/src/main/java/com/tangem/tap/features/onboarding/OnboardingSaltPayHelper.kt b/app/src/main/java/com/tangem/tap/features/onboarding/OnboardingSaltPayHelper.kt index 209fc789eb..b9aa35f096 100644 --- a/app/src/main/java/com/tangem/tap/features/onboarding/OnboardingSaltPayHelper.kt +++ b/app/src/main/java/com/tangem/tap/features/onboarding/OnboardingSaltPayHelper.kt @@ -12,39 +12,23 @@ import com.tangem.tap.preferencesStorage /** [REDACTED_AUTHOR] */ -class OnboardingSaltPayHelper { - companion object { +object OnboardingSaltPayHelper { + suspend fun isOnboardingCase(scanResponse: ScanResponse, manager: SaltPayActivationManager): Result { + return try { + var updatedStep = manager.update(SaltPayActivationStep.None, null).successOr { return it } - suspend fun isOnboardingCase( - scanResponse: ScanResponse, - manager: SaltPayActivationManager, - ): Result { - return try { - var updatedStep = manager.update(SaltPayActivationStep.None, null).successOr { return it } - - val cardStorage = preferencesStorage.usedCardsPrefStorage - val activationIsFinished = cardStorage.isActivationFinished(scanResponse.card.cardId) - if (updatedStep == SaltPayActivationStep.Success && activationIsFinished) { - updatedStep = SaltPayActivationStep.Finished - } - val isActivationCase = updatedStep != SaltPayActivationStep.Finished - val isBackupCase = scanResponse.card.backupStatus?.isActive == false - Result.Success(isActivationCase || isBackupCase) - } catch (ex: Exception) { - Result.Failure(ex) - } catch (error: SaltPayActivationError) { - Result.Failure(error) + val cardStorage = preferencesStorage.usedCardsPrefStorage + val activationIsFinished = cardStorage.isActivationFinished(scanResponse.card.cardId) + if (updatedStep == SaltPayActivationStep.Success && activationIsFinished) { + updatedStep = SaltPayActivationStep.Finished } + val isActivationCase = updatedStep != SaltPayActivationStep.Finished + val isBackupCase = scanResponse.card.backupStatus?.isActive == false + Result.Success(isActivationCase || isBackupCase) + } catch (ex: Exception) { + Result.Failure(ex) + } catch (error: SaltPayActivationError) { + Result.Failure(error) } - - fun testProceedToOnboarding( - scanResponse: ScanResponse, - manager: SaltPayActivationManager, - ): Result = Result.Success(true) - - fun testProceedToMainScreen( - scanResponse: ScanResponse, - manager: SaltPayActivationManager, - ): Result = Result.Success(false) } } \ No newline at end of file diff --git a/app/src/main/java/com/tangem/tap/features/onboarding/products/note/redux/OnboardingNoteMiddleware.kt b/app/src/main/java/com/tangem/tap/features/onboarding/products/note/redux/OnboardingNoteMiddleware.kt index bd7193cedc..4538cb5145 100644 --- a/app/src/main/java/com/tangem/tap/features/onboarding/products/note/redux/OnboardingNoteMiddleware.kt +++ b/app/src/main/java/com/tangem/tap/features/onboarding/products/note/redux/OnboardingNoteMiddleware.kt @@ -2,9 +2,9 @@ package com.tangem.tap.features.onboarding.products.note.redux import com.tangem.common.CompletionResult import com.tangem.common.extensions.guard +import com.tangem.core.analytics.Analytics import com.tangem.domain.common.extensions.withMainContext import com.tangem.tap.DELAY_SDK_DIALOG_CLOSE -import com.tangem.core.analytics.Analytics import com.tangem.tap.common.analytics.events.AnalyticsParam import com.tangem.tap.common.analytics.events.Onboarding import com.tangem.tap.common.extensions.dispatchDebugErrorNotification @@ -36,10 +36,8 @@ import org.rekotlin.Action import org.rekotlin.DispatchFunction import org.rekotlin.Middleware -class OnboardingNoteMiddleware { - companion object { - val handler = onboardingNoteMiddleware - } +object OnboardingNoteMiddleware { + val handler = onboardingNoteMiddleware } private val onboardingNoteMiddleware: Middleware = { dispatch, state -> @@ -51,6 +49,7 @@ private val onboardingNoteMiddleware: Middleware = { dispatch, state - } } +@Suppress("LongMethod", "ComplexMethod", "MagicNumber") private fun handleNoteAction(appState: () -> AppState?, action: Action, dispatch: DispatchFunction) { if (action !is OnboardingNoteAction) return if (DemoHelper.tryHandle(appState, action)) return @@ -80,7 +79,7 @@ private fun handleNoteAction(appState: () -> AppState?, action: Action, dispatch noteState.walletBalance.balanceIsToppedUp() -> OnboardingNoteStep.Done else -> OnboardingNoteStep.TopUpWallet } - store.dispatch((OnboardingNoteAction.SetStepOfScreen(step))) + store.dispatch(OnboardingNoteAction.SetStepOfScreen(step)) } is OnboardingNoteAction.SetStepOfScreen -> { when (action.step) { diff --git a/app/src/main/java/com/tangem/tap/features/onboarding/products/note/redux/OnboardingNoteReducer.kt b/app/src/main/java/com/tangem/tap/features/onboarding/products/note/redux/OnboardingNoteReducer.kt index 7626922560..5552fc8b50 100644 --- a/app/src/main/java/com/tangem/tap/features/onboarding/products/note/redux/OnboardingNoteReducer.kt +++ b/app/src/main/java/com/tangem/tap/features/onboarding/products/note/redux/OnboardingNoteReducer.kt @@ -4,10 +4,8 @@ import com.tangem.tap.common.redux.AppState import com.tangem.tap.common.redux.global.GlobalAction import org.rekotlin.Action -class OnboardingNoteReducer { - companion object { - fun reduce(action: Action, state: AppState): OnboardingNoteState = internalReduce(action, state) - } +object OnboardingNoteReducer { + fun reduce(action: Action, state: AppState): OnboardingNoteState = internalReduce(action, state) } private fun internalReduce(action: Action, appState: AppState): OnboardingNoteState { diff --git a/app/src/main/java/com/tangem/tap/features/onboarding/products/otherCards/redux/OnboardingOtherCardsMiddleware.kt b/app/src/main/java/com/tangem/tap/features/onboarding/products/otherCards/redux/OnboardingOtherCardsMiddleware.kt index e340caec6b..98f5ce5df2 100644 --- a/app/src/main/java/com/tangem/tap/features/onboarding/products/otherCards/redux/OnboardingOtherCardsMiddleware.kt +++ b/app/src/main/java/com/tangem/tap/features/onboarding/products/otherCards/redux/OnboardingOtherCardsMiddleware.kt @@ -2,9 +2,9 @@ package com.tangem.tap.features.onboarding.products.otherCards.redux import com.tangem.blockchain.common.Blockchain import com.tangem.common.CompletionResult +import com.tangem.core.analytics.Analytics import com.tangem.domain.common.extensions.withMainContext import com.tangem.tap.DELAY_SDK_DIALOG_CLOSE -import com.tangem.core.analytics.Analytics import com.tangem.tap.common.analytics.events.Onboarding import com.tangem.tap.common.postUi import com.tangem.tap.common.redux.AppState @@ -20,10 +20,8 @@ import kotlinx.coroutines.launch import org.rekotlin.Action import org.rekotlin.Middleware -class OnboardingOtherCardsMiddleware { - companion object { - val handler = onboardingOtherCardsMiddleware - } +object OnboardingOtherCardsMiddleware { + val handler = onboardingOtherCardsMiddleware } private val onboardingOtherCardsMiddleware: Middleware = { dispatch, _ -> @@ -35,6 +33,7 @@ private val onboardingOtherCardsMiddleware: Middleware = { dispatch, _ } } +@Suppress("LongMethod", "ComplexMethod", "MagicNumber") private fun handleOtherCardsAction(action: Action) { if (action !is OnboardingOtherCardsAction) return val globalState = store.state.globalState @@ -59,7 +58,7 @@ private fun handleOtherCardsAction(action: Action) { card.wallets.isEmpty() -> OnboardingOtherCardsStep.CreateWallet else -> OnboardingOtherCardsStep.Done } - store.dispatch((OnboardingOtherCardsAction.SetStepOfScreen(step))) + store.dispatch(OnboardingOtherCardsAction.SetStepOfScreen(step)) } is OnboardingOtherCardsAction.SetStepOfScreen -> { when (action.step) { @@ -71,7 +70,7 @@ private fun handleOtherCardsAction(action: Action) { onboardingManager.activationFinished(card.cardId) postUi(200) { store.dispatch(OnboardingOtherCardsAction.Confetti.Show) } } - else -> {} + else -> Unit } } is OnboardingOtherCardsAction.CreateWallet -> { diff --git a/app/src/main/java/com/tangem/tap/features/onboarding/products/otherCards/redux/OnboardingOtherCardsReducer.kt b/app/src/main/java/com/tangem/tap/features/onboarding/products/otherCards/redux/OnboardingOtherCardsReducer.kt index e8dc2ae111..3dae886ef6 100644 --- a/app/src/main/java/com/tangem/tap/features/onboarding/products/otherCards/redux/OnboardingOtherCardsReducer.kt +++ b/app/src/main/java/com/tangem/tap/features/onboarding/products/otherCards/redux/OnboardingOtherCardsReducer.kt @@ -4,10 +4,8 @@ import com.tangem.tap.common.redux.AppState import com.tangem.tap.common.redux.global.GlobalAction import org.rekotlin.Action -class OnboardingOtherCardsReducer { - companion object { - fun reduce(action: Action, state: AppState): OnboardingOtherCardsState = internalReduce(action, state) - } +object OnboardingOtherCardsReducer { + fun reduce(action: Action, state: AppState): OnboardingOtherCardsState = internalReduce(action, state) } private fun internalReduce(action: Action, appState: AppState): OnboardingOtherCardsState { diff --git a/app/src/main/java/com/tangem/tap/features/onboarding/products/twins/redux/TwinCardsMiddleware.kt b/app/src/main/java/com/tangem/tap/features/onboarding/products/twins/redux/TwinCardsMiddleware.kt index f89ce801df..3a636728f0 100644 --- a/app/src/main/java/com/tangem/tap/features/onboarding/products/twins/redux/TwinCardsMiddleware.kt +++ b/app/src/main/java/com/tangem/tap/features/onboarding/products/twins/redux/TwinCardsMiddleware.kt @@ -4,10 +4,10 @@ import com.tangem.blockchain.common.Blockchain import com.tangem.blockchain.extensions.Result import com.tangem.common.CompletionResult import com.tangem.common.extensions.guard +import com.tangem.core.analytics.Analytics import com.tangem.domain.common.ScanResponse import com.tangem.domain.common.extensions.withMainContext import com.tangem.tap.DELAY_SDK_DIALOG_CLOSE -import com.tangem.core.analytics.Analytics import com.tangem.tap.common.analytics.events.AnalyticsParam import com.tangem.tap.common.analytics.events.Onboarding import com.tangem.tap.common.extensions.dispatchDialogShow @@ -39,10 +39,8 @@ import org.rekotlin.Action import org.rekotlin.DispatchFunction import org.rekotlin.Middleware -class TwinCardsMiddleware { - companion object { - val handler = twinsWalletMiddleware - } +object TwinCardsMiddleware { + val handler = twinsWalletMiddleware } private val twinsWalletMiddleware: Middleware = { dispatch, state -> @@ -54,6 +52,7 @@ private val twinsWalletMiddleware: Middleware = { dispatch, state -> } } +@Suppress("LongMethod", "ComplexMethod", "MagicNumber") private fun handle(action: Action, dispatch: DispatchFunction) { val action = action as? TwinCardsAction ?: return @@ -111,7 +110,7 @@ private fun handle(action: Action, dispatch: DispatchFunction) { twinCardsState.walletBalance.balanceIsToppedUp() -> TwinCardsStep.Done else -> TwinCardsStep.TopUpWallet } - store.dispatch((TwinCardsAction.SetStepOfScreen(step))) + store.dispatch(TwinCardsAction.SetStepOfScreen(step)) } else { store.dispatch(TwinCardsAction.SetStepOfScreen(TwinCardsStep.Welcome)) } @@ -266,7 +265,7 @@ private fun handle(action: Action, dispatch: DispatchFunction) { scope.launch { val loadedBalance = onboardingManager?.updateBalance(walletManager) ?: return@launch - loadedBalance.criticalError?.let { store.dispatchErrorNotification(it) } + loadedBalance.criticalError?.let(store::dispatchErrorNotification) delay(if (isLoadedBefore) 0 else 300) withMainContext { store.dispatch(TwinCardsAction.Balance.Set(loadedBalance)) diff --git a/app/src/main/java/com/tangem/tap/features/onboarding/products/twins/redux/TwinCardsReducer.kt b/app/src/main/java/com/tangem/tap/features/onboarding/products/twins/redux/TwinCardsReducer.kt index d501a484a6..878176c323 100644 --- a/app/src/main/java/com/tangem/tap/features/onboarding/products/twins/redux/TwinCardsReducer.kt +++ b/app/src/main/java/com/tangem/tap/features/onboarding/products/twins/redux/TwinCardsReducer.kt @@ -4,12 +4,11 @@ import com.tangem.domain.common.getTwinCardNumber import com.tangem.tap.common.redux.AppState import org.rekotlin.Action -class TwinCardsReducer { - companion object { - fun reduce(action: Action, state: AppState): TwinCardsState = internalReduce(action, state) - } +object TwinCardsReducer { + fun reduce(action: Action, state: AppState): TwinCardsState = internalReduce(action, state) } +@Suppress("ComplexMethod") private fun internalReduce(action: Action, state: AppState): TwinCardsState { if (action !is TwinCardsAction) return state.twinCardsState diff --git a/app/src/main/java/com/tangem/tap/features/onboarding/products/twins/ui/TwinsCardsFragment.kt b/app/src/main/java/com/tangem/tap/features/onboarding/products/twins/ui/TwinsCardsFragment.kt index e3867c6b8d..aa307a448d 100644 --- a/app/src/main/java/com/tangem/tap/features/onboarding/products/twins/ui/TwinsCardsFragment.kt +++ b/app/src/main/java/com/tangem/tap/features/onboarding/products/twins/ui/TwinsCardsFragment.kt @@ -13,12 +13,12 @@ import coil.load import com.tangem.Message import com.tangem.blockchain.common.Blockchain import com.tangem.common.extensions.VoidCallback +import com.tangem.core.analytics.Analytics import com.tangem.core.ui.fragments.setStatusBarColor import com.tangem.domain.common.ScanResponse import com.tangem.domain.common.TwinCardNumber import com.tangem.tangem_sdk_new.ui.widget.leapfrogWidget.LeapfrogWidget import com.tangem.tap.common.AndroidAssetReader -import com.tangem.core.analytics.Analytics import com.tangem.tap.common.analytics.events.Onboarding import com.tangem.tap.common.extensions.beginDelayedTransition import com.tangem.tap.common.extensions.getDrawableCompat @@ -40,6 +40,7 @@ import com.tangem.tap.store import com.tangem.wallet.R import com.tangem.wallet.databinding.LayoutOnboardingContainerTopBinding +@Suppress("LargeClass") class TwinsCardsFragment : BaseOnboardingFragment() { private val mainBinding by lazy { binding.vMain } @@ -64,6 +65,7 @@ class TwinsCardsFragment : BaseOnboardingFragment() { } } + @Suppress("MagicNumber") override fun onViewCreated(view: View, savedInstanceState: Bundle?) { super.onViewCreated(view, savedInstanceState) addBackPressHandler(this) @@ -409,8 +411,7 @@ class TwinsCardsFragment : BaseOnboardingFragment() { TwinCardsAction.Wallet.HandleOnBackPressed { should, popAction -> store.dispatch(TwinCardsAction.Confetti.Hide) showConfetti(false) - if (should) switchToCard(TwinCardNumber.First, true, popAction) - else popAction() + if (should) switchToCard(TwinCardNumber.First, true, popAction) else popAction() }, ) } diff --git a/app/src/main/java/com/tangem/tap/features/onboarding/products/twins/ui/dialog/CreateWalletInterruptDialog.kt b/app/src/main/java/com/tangem/tap/features/onboarding/products/twins/ui/dialog/CreateWalletInterruptDialog.kt index 62d98c1f69..72a7ae7f2e 100644 --- a/app/src/main/java/com/tangem/tap/features/onboarding/products/twins/ui/dialog/CreateWalletInterruptDialog.kt +++ b/app/src/main/java/com/tangem/tap/features/onboarding/products/twins/ui/dialog/CreateWalletInterruptDialog.kt @@ -4,21 +4,18 @@ import android.content.Context import androidx.appcompat.app.AlertDialog import com.google.android.material.dialog.MaterialAlertDialogBuilder import com.tangem.tap.common.extensions.dispatchDialogHide -import com.tangem.tap.features.onboarding.products.twins.redux.TwinCardsAction import com.tangem.tap.store import com.tangem.wallet.R /** [REDACTED_AUTHOR] */ -class CreateWalletInterruptDialog { - companion object { - fun create(state: TwinCardsAction.Wallet.ShowInterruptDialog, context: Context): AlertDialog { - return MaterialAlertDialogBuilder(context) - .setMessage(R.string.onboarding_twin_exit_warning) - .setPositiveButton(R.string.warning_button_ok) { _, _ -> } - .setOnDismissListener { store.dispatchDialogHide() } - .create() - } +object CreateWalletInterruptDialog { + fun create(context: Context): AlertDialog { + return MaterialAlertDialogBuilder(context) + .setMessage(R.string.onboarding_twin_exit_warning) + .setPositiveButton(R.string.warning_button_ok) { _, _ -> } + .setOnDismissListener { store.dispatchDialogHide() } + .create() } } \ No newline at end of file diff --git a/app/src/main/java/com/tangem/tap/features/onboarding/products/wallet/redux/OnboardingWalletMiddleware.kt b/app/src/main/java/com/tangem/tap/features/onboarding/products/wallet/redux/OnboardingWalletMiddleware.kt index eeb074dc0c..b4daef5268 100644 --- a/app/src/main/java/com/tangem/tap/features/onboarding/products/wallet/redux/OnboardingWalletMiddleware.kt +++ b/app/src/main/java/com/tangem/tap/features/onboarding/products/wallet/redux/OnboardingWalletMiddleware.kt @@ -4,13 +4,13 @@ import android.net.Uri import com.tangem.blockchain.common.Blockchain import com.tangem.common.CompletionResult import com.tangem.common.extensions.ifNotNull +import com.tangem.core.analytics.Analytics import com.tangem.domain.common.CardDTO import com.tangem.domain.common.ScanResponse import com.tangem.domain.common.TapWorkarounds.isSaltPay import com.tangem.domain.common.extensions.withMainContext import com.tangem.operations.backup.BackupService import com.tangem.tap.backupService -import com.tangem.core.analytics.Analytics import com.tangem.tap.common.analytics.events.Onboarding import com.tangem.tap.common.extensions.dispatchDialogShow import com.tangem.tap.common.extensions.dispatchOnMain @@ -37,10 +37,8 @@ import org.rekotlin.Action import org.rekotlin.DispatchFunction import org.rekotlin.Middleware -class OnboardingWalletMiddleware { - companion object { - val handler = onboardingWalletMiddleware - } +object OnboardingWalletMiddleware { + val handler = onboardingWalletMiddleware } private val onboardingWalletMiddleware: Middleware = { dispatch, state -> @@ -52,6 +50,7 @@ private val onboardingWalletMiddleware: Middleware = { dispatch, state } } +@Suppress("LongMethod", "ComplexMethod") private fun handleWalletAction(action: Action, state: () -> AppState?, dispatch: DispatchFunction) { if (action !is OnboardingWalletAction) return @@ -218,6 +217,7 @@ class BackupMiddleware { } } +@Suppress("LongMethod", "ComplexMethod", "MagicNumber") private fun handleBackupAction(appState: () -> AppState?, action: BackupAction) { if (DemoHelper.tryHandle(appState, action)) return val globalState = appState()?.globalState ?: return @@ -396,7 +396,7 @@ private fun initSaltPayOnBackupFinishedIfNeeded( onboardingWalletState: OnboardingWalletState, ) { if (onboardingWalletState.isSaltPay && onboardingWalletState.onboardingSaltPayState == null) { - if (scanResponse == null) throw IllegalArgumentException() + if (scanResponse == null) error("scanning response is null") val (manager, config) = OnboardingSaltPayState.initDependency(scanResponse) store.dispatchOnMain(OnboardingSaltPayAction.SetDependencies(manager, config)) diff --git a/app/src/main/java/com/tangem/tap/features/onboarding/products/wallet/redux/OnboardingWalletReducer.kt b/app/src/main/java/com/tangem/tap/features/onboarding/products/wallet/redux/OnboardingWalletReducer.kt index 2e50716048..ffc422f1a3 100644 --- a/app/src/main/java/com/tangem/tap/features/onboarding/products/wallet/redux/OnboardingWalletReducer.kt +++ b/app/src/main/java/com/tangem/tap/features/onboarding/products/wallet/redux/OnboardingWalletReducer.kt @@ -7,10 +7,8 @@ import com.tangem.tap.features.onboarding.products.wallet.saltPay.redux.Onboardi import com.tangem.tap.features.onboarding.products.wallet.saltPay.redux.OnboardingSaltPayReducer import org.rekotlin.Action -class OnboardingWalletReducer { - companion object { - fun reduce(action: Action, state: AppState): OnboardingWalletState = internalReduce(action, state) - } +object OnboardingWalletReducer { + fun reduce(action: Action, state: AppState): OnboardingWalletState = internalReduce(action, state) } private fun internalReduce(action: Action, appState: AppState): OnboardingWalletState { @@ -36,103 +34,78 @@ private fun internalReduce(action: Action, appState: AppState): OnboardingWallet } } -private class ReducerForGlobalAction { - companion object { - fun reduce(action: GlobalAction.Onboarding, state: OnboardingWalletState): OnboardingWalletState { - return when (action) { - is GlobalAction.Onboarding.Start -> { - OnboardingWalletState( - backupState = state.backupState.copy( - maxBackupCards = if (action.scanResponse.isSaltPay()) 1 else 2, - canSkipBackup = if (action.scanResponse.isSaltPay()) false else action.canSkipBackup, - ), - isSaltPay = action.scanResponse.isSaltPay(), - ) - } - is GlobalAction.Onboarding.StartForUnfinishedBackup -> { - OnboardingWalletState( - backupState = state.backupState.copy( - maxBackupCards = action.addedBackupCardsCount, - canSkipBackup = false, - ), - isSaltPay = false, - ) - } - else -> state +private object ReducerForGlobalAction { + fun reduce(action: GlobalAction.Onboarding, state: OnboardingWalletState): OnboardingWalletState { + return when (action) { + is GlobalAction.Onboarding.Start -> { + OnboardingWalletState( + backupState = state.backupState.copy( + maxBackupCards = if (action.scanResponse.isSaltPay()) 1 else 2, + canSkipBackup = if (action.scanResponse.isSaltPay()) false else action.canSkipBackup, + ), + isSaltPay = action.scanResponse.isSaltPay(), + ) } + is GlobalAction.Onboarding.StartForUnfinishedBackup -> { + OnboardingWalletState( + backupState = state.backupState.copy( + maxBackupCards = action.addedBackupCardsCount, + canSkipBackup = false, + ), + isSaltPay = false, + ) + } + else -> state } } } -private class BackupReducer { - companion object { - fun reduce( - action: BackupAction, - state: BackupState, - isSaltPay: Boolean, - ): BackupState { - - return when (action) { - is BackupAction.IntroduceBackup -> BackupState( - backupStep = BackupStep.InitBackup, - maxBackupCards = if (isSaltPay) 1 else 2, - canSkipBackup = state.canSkipBackup, +private object BackupReducer { + @Suppress("ComplexMethod") + fun reduce(action: BackupAction, state: BackupState, isSaltPay: Boolean): BackupState { + return when (action) { + is BackupAction.IntroduceBackup -> BackupState( + backupStep = BackupStep.InitBackup, + maxBackupCards = if (isSaltPay) 1 else 2, + canSkipBackup = state.canSkipBackup, + ) + BackupAction.StartAddingPrimaryCard -> state.copy(backupStep = BackupStep.ScanOriginCard) + BackupAction.StartAddingBackupCards -> state.copy(backupStep = BackupStep.AddBackupCards) + BackupAction.AddBackupCard.Success -> state.copy(backupCardsNumber = state.backupCardsNumber + 1) + BackupAction.ShowAccessCodeInfoScreen -> state.copy(backupStep = BackupStep.SetAccessCode) + BackupAction.ShowEnterAccessCodeScreen -> state.copy( + backupStep = BackupStep.EnterAccessCode, + accessCodeError = null, + ) + is BackupAction.SaveFirstAccessCode -> state.copy( + backupStep = BackupStep.ReenterAccessCode, + accessCode = action.accessCode, + ) + is BackupAction.SetAccessCodeError -> state.copy(accessCodeError = action.error) + is BackupAction.PrepareToWritePrimaryCard -> if (state.primaryCardId == null) { + state.copy( + primaryCardId = backupService.primaryCardId, + backupCardIds = backupService.backupCardIds, + backupCardsNumber = backupService.backupCardIds.size, + backupStep = BackupStep.WritePrimaryCard, ) - BackupAction.StartAddingPrimaryCard -> state.copy(backupStep = BackupStep.ScanOriginCard) - BackupAction.StartAddingBackupCards -> { - state.copy(backupStep = BackupStep.AddBackupCards) - } - BackupAction.AddBackupCard.Success -> { - state.copy(backupCardsNumber = state.backupCardsNumber + 1) - } - BackupAction.ShowAccessCodeInfoScreen -> { - state.copy(backupStep = BackupStep.SetAccessCode) - } - BackupAction.ShowEnterAccessCodeScreen -> { - state.copy(backupStep = BackupStep.EnterAccessCode, accessCodeError = null) - } - is BackupAction.SaveFirstAccessCode -> { - state.copy( - backupStep = BackupStep.ReenterAccessCode, - accessCode = action.accessCode, - ) - } - is BackupAction.SetAccessCodeError -> { - state.copy(accessCodeError = action.error) - } - is BackupAction.PrepareToWritePrimaryCard -> { - if (state.primaryCardId == null) { - state.copy( - primaryCardId = backupService.primaryCardId, - backupCardIds = backupService.backupCardIds, - backupCardsNumber = backupService.backupCardIds.size, - backupStep = BackupStep.WritePrimaryCard, - ) - } else { - state.copy(backupStep = BackupStep.WritePrimaryCard) - } - } - is BackupAction.PrepareToWriteBackupCard -> { - if (state.primaryCardId == null) { - state.copy( - primaryCardId = backupService.primaryCardId, - backupCardIds = backupService.backupCardIds, - backupCardsNumber = backupService.backupCardIds.size, - backupStep = BackupStep.WriteBackupCard(action.cardNumber), - ) - } else { - state.copy(backupStep = BackupStep.WriteBackupCard(action.cardNumber)) - } - } - is BackupAction.FinishBackup -> { - state.copy(backupStep = BackupStep.Finished) - } - BackupAction.OnAccessCodeDialogClosed -> { - state.copy(backupStep = BackupStep.AddBackupCards) - } - BackupAction.DiscardBackup -> BackupState() - else -> state + } else { + state.copy(backupStep = BackupStep.WritePrimaryCard) } + is BackupAction.PrepareToWriteBackupCard -> if (state.primaryCardId == null) { + state.copy( + primaryCardId = backupService.primaryCardId, + backupCardIds = backupService.backupCardIds, + backupCardsNumber = backupService.backupCardIds.size, + backupStep = BackupStep.WriteBackupCard(action.cardNumber), + ) + } else { + state.copy(backupStep = BackupStep.WriteBackupCard(action.cardNumber)) + } + is BackupAction.FinishBackup -> state.copy(backupStep = BackupStep.Finished) + BackupAction.OnAccessCodeDialogClosed -> state.copy(backupStep = BackupStep.AddBackupCards) + BackupAction.DiscardBackup -> BackupState() + else -> state } } } \ No newline at end of file diff --git a/app/src/main/java/com/tangem/tap/features/onboarding/products/wallet/redux/OnboardingWalletState.kt b/app/src/main/java/com/tangem/tap/features/onboarding/products/wallet/redux/OnboardingWalletState.kt index 23da378819..f678ff716e 100644 --- a/app/src/main/java/com/tangem/tap/features/onboarding/products/wallet/redux/OnboardingWalletState.kt +++ b/app/src/main/java/com/tangem/tap/features/onboarding/products/wallet/redux/OnboardingWalletState.kt @@ -31,11 +31,13 @@ data class OnboardingWalletState( else -> null } + @Suppress("MagicNumber") fun getMaxProgress(): Int = when { isSaltPay -> 12 else -> 6 } + @Suppress("ComplexMethod", "MagicNumber") fun getProgressStep(): Int { return when { step == OnboardingWalletStep.CreateWallet -> 1 @@ -106,7 +108,7 @@ sealed class BackupStep { object Finished : BackupStep() } -sealed class OnboardingDialog: StateDialog { +sealed class OnboardingDialog : StateDialog { data class InterruptOnboarding(val onOk: VoidCallback) : BackupDialog() } diff --git a/app/src/main/java/com/tangem/tap/features/onboarding/products/wallet/saltPay/GnosisRegistrator.kt b/app/src/main/java/com/tangem/tap/features/onboarding/products/wallet/saltPay/GnosisRegistrator.kt index 6e0f223452..3a17f07fb7 100644 --- a/app/src/main/java/com/tangem/tap/features/onboarding/products/wallet/saltPay/GnosisRegistrator.kt +++ b/app/src/main/java/com/tangem/tap/features/onboarding/products/wallet/saltPay/GnosisRegistrator.kt @@ -159,11 +159,15 @@ class GnosisRegistrator( return Result.Success(Unit) } + @Suppress("MagicNumber") private fun Result>.extractFeeAmount(): Result { return when (this) { is Result.Success -> { - if (this.data.size != 3) Result.Failure(BlockchainSdkError.FailedToLoadFee) - else Result.Success(this.data[1]) + if (this.data.size != 3) { + Result.Failure(BlockchainSdkError.FailedToLoadFee) + } else { + Result.Success(this.data[1]) + } } is Result.Failure -> this } diff --git a/app/src/main/java/com/tangem/tap/features/onboarding/products/wallet/saltPay/PinFilters.kt b/app/src/main/java/com/tangem/tap/features/onboarding/products/wallet/saltPay/PinFilters.kt index 15a4137ec0..fd359c25a4 100644 --- a/app/src/main/java/com/tangem/tap/features/onboarding/products/wallet/saltPay/PinFilters.kt +++ b/app/src/main/java/com/tangem/tap/features/onboarding/products/wallet/saltPay/PinFilters.kt @@ -5,9 +5,9 @@ import com.tangem.common.Filter /** [REDACTED_AUTHOR] */ -abstract class PinFilter : Filter +interface PinFilter : Filter -class AllSymbolsTheSameFilter : PinFilter() { +class AllSymbolsTheSameFilter : PinFilter { override fun filter(value: String): Boolean { if (value.isEmpty()) return false diff --git a/app/src/main/java/com/tangem/tap/features/onboarding/products/wallet/saltPay/SaltPayActivationManager.kt b/app/src/main/java/com/tangem/tap/features/onboarding/products/wallet/saltPay/SaltPayActivationManager.kt index 9085764bf1..2e75c77dce 100644 --- a/app/src/main/java/com/tangem/tap/features/onboarding/products/wallet/saltPay/SaltPayActivationManager.kt +++ b/app/src/main/java/com/tangem/tap/features/onboarding/products/wallet/saltPay/SaltPayActivationManager.kt @@ -29,6 +29,7 @@ import com.tangem.tap.features.onboarding.products.wallet.saltPay.message.SaltPa import kotlinx.coroutines.Dispatchers import kotlinx.coroutines.withContext import java.math.BigDecimal +import com.tangem.blockchain.extensions.Result as BlockchainResult /** [REDACTED_AUTHOR] @@ -50,12 +51,12 @@ class SaltPayActivationManager( suspend fun checkHasGas(): Result { return when (val hasGasResult = gnosisRegistrator.checkHasGas()) { - is com.tangem.blockchain.extensions.Result.Success -> if (hasGasResult.data) { + is BlockchainResult.Success -> if (hasGasResult.data) { Result.Success(Unit) } else { Result.Failure(SaltPayActivationError.NoGas) } - is com.tangem.blockchain.extensions.Result.Failure -> Result.Failure(hasGasResult.error as BlockchainSdkError) + is BlockchainResult.Failure -> Result.Failure(hasGasResult.error as BlockchainSdkError) } } @@ -92,7 +93,7 @@ class SaltPayActivationManager( if (response.results.isEmpty()) throw SaltPayActivationError.EmptyResponse val item = response.results[0] - if (item.error != null) throw Exception(response.makeErrorMessage()) + if (item.error != null) throw IllegalStateException(response.makeErrorMessage()) Result.Success(item) } catch (ex: Exception) { @@ -117,7 +118,7 @@ class SaltPayActivationManager( suspend fun sendTransactions( signedTransactions: List, - ): com.tangem.blockchain.extensions.Result> { + ): BlockchainResult> { return gnosisRegistrator.sendTransactions(signedTransactions) } diff --git a/app/src/main/java/com/tangem/tap/features/onboarding/products/wallet/saltPay/SaltPayExceptionHandler.kt b/app/src/main/java/com/tangem/tap/features/onboarding/products/wallet/saltPay/SaltPayExceptionHandler.kt index 3b4ed41a05..cf34a759d4 100644 --- a/app/src/main/java/com/tangem/tap/features/onboarding/products/wallet/saltPay/SaltPayExceptionHandler.kt +++ b/app/src/main/java/com/tangem/tap/features/onboarding/products/wallet/saltPay/SaltPayExceptionHandler.kt @@ -11,35 +11,33 @@ import com.tangem.tap.store /** [REDACTED_AUTHOR] */ -class SaltPayExceptionHandler { - companion object { - fun handle(throwable: Throwable) { - when (throwable) { - is SaltPayActivationError -> { - val dialog = when (throwable) { - is SaltPayActivationError.NoGas -> SaltPayDialog.Activation.NoGas - else -> SaltPayDialog.Activation.OnError(throwable) - } - store.dispatchDialogShow(dialog) +object SaltPayExceptionHandler { + fun handle(throwable: Throwable) { + when (throwable) { + is SaltPayActivationError -> { + val dialog = when (throwable) { + is SaltPayActivationError.NoGas -> SaltPayDialog.Activation.NoGas + else -> SaltPayDialog.Activation.OnError(throwable) } - is TangemSdkError -> { - when (throwable) { - is TangemSdkError.NetworkError -> { - val message = (throwable).customMessage - store.dispatchDialogShow(AppDialog.SimpleOkErrorDialog(message)) - } - else -> { - // do nothing - } + store.dispatchDialogShow(dialog) + } + is TangemSdkError -> { + when (throwable) { + is TangemSdkError.NetworkError -> { + val message = throwable.customMessage + store.dispatchDialogShow(AppDialog.SimpleOkErrorDialog(message)) + } + else -> { + // do nothing } } - is BlockchainSdkError -> { - store.dispatchDialogShow(AppDialog.SimpleOkErrorDialog(throwable.customMessage)) - } - else -> { - val message = throwable.localizedMessage ?: "SaltPay unknown error" - store.dispatchDialogShow(AppDialog.SimpleOkErrorDialog(message)) - } + } + is BlockchainSdkError -> { + store.dispatchDialogShow(AppDialog.SimpleOkErrorDialog(throwable.customMessage)) + } + else -> { + val message = throwable.localizedMessage ?: "SaltPay unknown error" + store.dispatchDialogShow(AppDialog.SimpleOkErrorDialog(message)) } } } diff --git a/app/src/main/java/com/tangem/tap/features/onboarding/products/wallet/saltPay/UtorgWebView.kt b/app/src/main/java/com/tangem/tap/features/onboarding/products/wallet/saltPay/UtorgWebView.kt index b773adcb70..fccce0450e 100644 --- a/app/src/main/java/com/tangem/tap/features/onboarding/products/wallet/saltPay/UtorgWebView.kt +++ b/app/src/main/java/com/tangem/tap/features/onboarding/products/wallet/saltPay/UtorgWebView.kt @@ -64,7 +64,9 @@ class UtorgWebChromeClient( if (!readyToShowFileChooser()) return false val type: String - if (fileChooserParams != null && fileChooserParams.acceptTypes != null && fileChooserParams.acceptTypes.isNotEmpty()) { + if (fileChooserParams != null && fileChooserParams.acceptTypes != null + && fileChooserParams.acceptTypes.isNotEmpty() + ) { type = if (!TextUtils.isEmpty(fileChooserParams.acceptTypes[0])) fileChooserParams.acceptTypes[0] else "*/*" this.filePathCallback = filePathCallback } else { diff --git a/app/src/main/java/com/tangem/tap/features/onboarding/products/wallet/saltPay/dialog/InterruptOnboardingDialog.kt b/app/src/main/java/com/tangem/tap/features/onboarding/products/wallet/saltPay/dialog/InterruptOnboardingDialog.kt index 1636675ae1..35a99173c3 100644 --- a/app/src/main/java/com/tangem/tap/features/onboarding/products/wallet/saltPay/dialog/InterruptOnboardingDialog.kt +++ b/app/src/main/java/com/tangem/tap/features/onboarding/products/wallet/saltPay/dialog/InterruptOnboardingDialog.kt @@ -11,17 +11,15 @@ import com.tangem.wallet.R /** [REDACTED_AUTHOR] */ -class InterruptOnboardingDialog { - companion object { - fun create(context: Context, dialog: OnboardingDialog.InterruptOnboarding): Dialog { - return AlertDialog.Builder(context).apply { - setTitle(context.getString(R.string.onboarding_exit_alert_title)) - setMessage(context.getString(R.string.onboarding_exit_alert_message)) - setPositiveButton(R.string.common_ok) { _, _ -> dialog.onOk() } - setNegativeButton(R.string.common_cancel) { _, _ -> } - setOnDismissListener { store.dispatchDialogHide() } - setCancelable(false) - }.create() - } +object InterruptOnboardingDialog { + fun create(context: Context, dialog: OnboardingDialog.InterruptOnboarding): Dialog { + return AlertDialog.Builder(context).apply { + setTitle(context.getString(R.string.onboarding_exit_alert_title)) + setMessage(context.getString(R.string.onboarding_exit_alert_message)) + setPositiveButton(R.string.common_ok) { _, _ -> dialog.onOk() } + setNegativeButton(R.string.common_cancel) { _, _ -> } + setOnDismissListener { store.dispatchDialogHide() } + setCancelable(false) + }.create() } } \ No newline at end of file diff --git a/app/src/main/java/com/tangem/tap/features/onboarding/products/wallet/saltPay/dialog/NoFundsForActivationDialog.kt b/app/src/main/java/com/tangem/tap/features/onboarding/products/wallet/saltPay/dialog/NoFundsForActivationDialog.kt index 579f34d614..175e53ae38 100644 --- a/app/src/main/java/com/tangem/tap/features/onboarding/products/wallet/saltPay/dialog/NoFundsForActivationDialog.kt +++ b/app/src/main/java/com/tangem/tap/features/onboarding/products/wallet/saltPay/dialog/NoFundsForActivationDialog.kt @@ -13,27 +13,25 @@ import com.tangem.wallet.R /** [REDACTED_AUTHOR] */ -class NoFundsForActivationDialog { - companion object { - fun create(context: Context): Dialog { - return AlertDialog.Builder(context).apply { - setTitle(R.string.saltpay_error_no_gas_title) - setMessage(R.string.saltpay_error_no_gas_message) - //TODO: SaltPay: change onboarding_supplement_button_kyc_waiting -> to appropriate string - setPositiveButton(R.string.onboarding_supplement_button_kyc_waiting) { _, _ -> - val config = store.state.globalState.configManager?.config?.saltPayConfig?.zendesk.guard { - store.dispatchDebugErrorNotification("SaltPayConfig not initialized") - return@setPositiveButton - } - store.dispatch(GlobalAction.OpenChat(SupportInfo(), config)) +object NoFundsForActivationDialog { + fun create(context: Context): Dialog { + return AlertDialog.Builder(context).apply { + setTitle(R.string.saltpay_error_no_gas_title) + setMessage(R.string.saltpay_error_no_gas_message) + //TODO: SaltPay: change onboarding_supplement_button_kyc_waiting -> to appropriate string + setPositiveButton(R.string.onboarding_supplement_button_kyc_waiting) { _, _ -> + val config = store.state.globalState.configManager?.config?.saltPayConfig?.zendesk.guard { + store.dispatchDebugErrorNotification("SaltPayConfig not initialized") + return@setPositiveButton } - setNegativeButton(R.string.common_cancel) { _, _ -> - } - setOnDismissListener { - store.dispatch(GlobalAction.HideDialog) - } - setCancelable(false) - }.create() - } + store.dispatch(GlobalAction.OpenChat(SupportInfo(), config)) + } + setNegativeButton(R.string.common_cancel) { _, _ -> + } + setOnDismissListener { + store.dispatch(GlobalAction.HideDialog) + } + setCancelable(false) + }.create() } } \ No newline at end of file diff --git a/app/src/main/java/com/tangem/tap/features/onboarding/products/wallet/saltPay/dialog/RegistrationErrorDialog.kt b/app/src/main/java/com/tangem/tap/features/onboarding/products/wallet/saltPay/dialog/RegistrationErrorDialog.kt index 831d097783..f3c184157f 100644 --- a/app/src/main/java/com/tangem/tap/features/onboarding/products/wallet/saltPay/dialog/RegistrationErrorDialog.kt +++ b/app/src/main/java/com/tangem/tap/features/onboarding/products/wallet/saltPay/dialog/RegistrationErrorDialog.kt @@ -12,22 +12,20 @@ import com.tangem.wallet.R /** [REDACTED_AUTHOR] */ -class RegistrationErrorDialog { - companion object { - fun create(context: Context, dialog: SaltPayDialog.Activation.OnError): Dialog { - val convertedMessage = SaltPayErrorConverter(context).convert(dialog.error) as ConvertedDialogMessage +object RegistrationErrorDialog { + fun create(context: Context, dialog: SaltPayDialog.Activation.OnError): Dialog { + val convertedMessage = SaltPayErrorConverter(context).convert(dialog.error) as ConvertedDialogMessage - return AlertDialog.Builder(context).apply { - setTitle(convertedMessage.title) - setMessage(convertedMessage.message) - setPositiveButton(R.string.common_ok) { _, _ -> - store.dispatch(GlobalAction.HideDialog) - } - setOnDismissListener { - store.dispatch(GlobalAction.HideDialog) - } - setCancelable(false) - }.create() - } + return AlertDialog.Builder(context).apply { + setTitle(convertedMessage.title) + setMessage(convertedMessage.message) + setPositiveButton(R.string.common_ok) { _, _ -> + store.dispatch(GlobalAction.HideDialog) + } + setOnDismissListener { + store.dispatch(GlobalAction.HideDialog) + } + setCancelable(false) + }.create() } } \ No newline at end of file diff --git a/app/src/main/java/com/tangem/tap/features/onboarding/products/wallet/saltPay/message/SaltPayModuleMessage.kt b/app/src/main/java/com/tangem/tap/features/onboarding/products/wallet/saltPay/message/SaltPayModuleMessage.kt index 6f2a5de7ad..a8e4a95885 100644 --- a/app/src/main/java/com/tangem/tap/features/onboarding/products/wallet/saltPay/message/SaltPayModuleMessage.kt +++ b/app/src/main/java/com/tangem/tap/features/onboarding/products/wallet/saltPay/message/SaltPayModuleMessage.kt @@ -28,27 +28,26 @@ sealed class SaltPayActivationError( subCode = ERROR_CODE_REGISTRATION + subCode, message = message ?: EMPTY_MESSAGE, ) { - object Unknown : SaltPayActivationError(4) - object Empty : SaltPayActivationError(4) + object Unknown : SaltPayActivationError(subCode = 4) + object Empty : SaltPayActivationError(subCode = 4) // gnosis - object FailedToMakeTxData : SaltPayActivationError(1) - object FailedToSendTx : SaltPayActivationError(2) + object FailedToMakeTxData : SaltPayActivationError(subCode = 1) + object FailedToSendTx : SaltPayActivationError(subCode = 2) - object NeedPin : SaltPayActivationError(3) - object NoGas : SaltPayActivationError(5) // - object EmptyResponse : SaltPayActivationError(6) - object CardNotFound : SaltPayActivationError(8) - class CardDisabled(message: String?) : SaltPayActivationError(9, message) - class CardNotPassed(message: String?) : SaltPayActivationError(10, message) - object EmptyDynamicAttestResponse : SaltPayActivationError(11) - object EmptyBackupCardScanned : SaltPayActivationError(12) - object WeakPin : SaltPayActivationError(13) + object NeedPin : SaltPayActivationError(subCode = 3) + object NoGas : SaltPayActivationError(subCode = 5) + object EmptyResponse : SaltPayActivationError(subCode = 6) + object CardNotFound : SaltPayActivationError(subCode = 8) + class CardDisabled(message: String?) : SaltPayActivationError(subCode = 9, message = message) + class CardNotPassed(message: String?) : SaltPayActivationError(subCode = 10, message = message) + object EmptyDynamicAttestResponse : SaltPayActivationError(subCode = 11) + object EmptyBackupCardScanned : SaltPayActivationError(subCode = 12) + object WeakPin : SaltPayActivationError(subCode = 13) - object FailedToGetFundsToClaim : SaltPayActivationError(14) - object NoFundsToClaim : SaltPayActivationError(15) - object ClaimTransactionFailed : SaltPayActivationError(16) - object NotClaimed : SaltPayActivationError(17) + object FailedToGetFundsToClaim : SaltPayActivationError(subCode = 14) + object NoFundsToClaim : SaltPayActivationError(subCode = 15) + object ClaimTransactionFailed : SaltPayActivationError(subCode = 16) companion object { const val EMPTY_MESSAGE = "" diff --git a/app/src/main/java/com/tangem/tap/features/onboarding/products/wallet/saltPay/redux/OnboardingSaltPayMiddleware.kt b/app/src/main/java/com/tangem/tap/features/onboarding/products/wallet/saltPay/redux/OnboardingSaltPayMiddleware.kt index 81d7ad4138..a97cb49580 100644 --- a/app/src/main/java/com/tangem/tap/features/onboarding/products/wallet/saltPay/redux/OnboardingSaltPayMiddleware.kt +++ b/app/src/main/java/com/tangem/tap/features/onboarding/products/wallet/saltPay/redux/OnboardingSaltPayMiddleware.kt @@ -39,10 +39,8 @@ import timber.log.Timber /** [REDACTED_AUTHOR] */ -class OnboardingSaltPayMiddleware { - companion object { - val handler = onboardingSaltPayMiddleware - } +object OnboardingSaltPayMiddleware { + val handler = onboardingSaltPayMiddleware } private val onboardingSaltPayMiddleware: Middleware = { dispatch, state -> @@ -54,6 +52,7 @@ private val onboardingSaltPayMiddleware: Middleware = { dispatch, stat } } +@Suppress("LongMethod", "ComplexMethod") private fun handleOnboardingSaltPayAction(anyAction: Action, appState: () -> AppState?) { if (DemoHelper.tryHandle(appState, anyAction)) return val action = anyAction as? OnboardingSaltPayAction ?: return @@ -292,6 +291,7 @@ suspend fun SaltPayActivationManager.update( return Result.Success(newStep) } +@Suppress("ComplexMethod") private fun determineStep( currentStep: SaltPayActivationStep, amountToClaim: Amount?, diff --git a/app/src/main/java/com/tangem/tap/features/onboarding/products/wallet/saltPay/redux/OnboardingSaltPayReducer.kt b/app/src/main/java/com/tangem/tap/features/onboarding/products/wallet/saltPay/redux/OnboardingSaltPayReducer.kt index 71570fd52e..9d4e8774c0 100644 --- a/app/src/main/java/com/tangem/tap/features/onboarding/products/wallet/saltPay/redux/OnboardingSaltPayReducer.kt +++ b/app/src/main/java/com/tangem/tap/features/onboarding/products/wallet/saltPay/redux/OnboardingSaltPayReducer.kt @@ -6,14 +6,13 @@ import org.rekotlin.Action /** [REDACTED_AUTHOR] */ -class OnboardingSaltPayReducer { - companion object { - fun reduce(action: Action, state: OnboardingWalletState): OnboardingWalletState { - return internalReduce(action, state) - } +object OnboardingSaltPayReducer { + fun reduce(action: Action, state: OnboardingWalletState): OnboardingWalletState { + return internalReduce(action, state) } } +@Suppress("ComplexMethod") private fun internalReduce(anyAction: Action, onboardingWalletState: OnboardingWalletState): OnboardingWalletState { val action = anyAction as? OnboardingSaltPayAction ?: return onboardingWalletState diff --git a/app/src/main/java/com/tangem/tap/features/onboarding/products/wallet/saltPay/redux/OnboardingSaltPayState.kt b/app/src/main/java/com/tangem/tap/features/onboarding/products/wallet/saltPay/redux/OnboardingSaltPayState.kt index e1317622a4..e530450920 100644 --- a/app/src/main/java/com/tangem/tap/features/onboarding/products/wallet/saltPay/redux/OnboardingSaltPayState.kt +++ b/app/src/main/java/com/tangem/tap/features/onboarding/products/wallet/saltPay/redux/OnboardingSaltPayState.kt @@ -4,9 +4,9 @@ import com.tangem.blockchain.common.Amount import com.tangem.blockchain.common.Blockchain import com.tangem.blockchain.common.WalletManagerFactory import com.tangem.common.extensions.guard +import com.tangem.datasource.api.paymentology.PaymentologyApiService import com.tangem.domain.common.SaltPayWorkaround import com.tangem.domain.common.ScanResponse -import com.tangem.datasource.api.paymentology.PaymentologyApiService import com.tangem.tap.common.toggleWidget.WidgetState import com.tangem.tap.domain.extensions.makeSaltPayWalletManager import com.tangem.tap.features.onboarding.products.wallet.saltPay.GnosisRegistrator @@ -37,8 +37,6 @@ data class OnboardingSaltPayState( val mainButtonState: WidgetState get() = if (inProgress) ProgressState.Loading else ProgressState.Done - fun readyToClaim(): Boolean = amountToClaim != null - val pinLength: Int = 4 companion object { diff --git a/app/src/main/java/com/tangem/tap/features/onboarding/products/wallet/saltPay/ui/OnboardingSaltPayView.kt b/app/src/main/java/com/tangem/tap/features/onboarding/products/wallet/saltPay/ui/OnboardingSaltPayView.kt index cfefd6b722..16f76fa654 100644 --- a/app/src/main/java/com/tangem/tap/features/onboarding/products/wallet/saltPay/ui/OnboardingSaltPayView.kt +++ b/app/src/main/java/com/tangem/tap/features/onboarding/products/wallet/saltPay/ui/OnboardingSaltPayView.kt @@ -63,7 +63,9 @@ internal class OnboardingSaltPayView( private val toolbar: MaterialToolbar by lazy { walletFragment.binding.toolbar } private val claimBinding: LayoutOnboardingMainBinding by lazy { walletFragment.bindingSaltPay.claim } private val topContainer: LayoutOnboardingContainerTopBinding by lazy { claimBinding.onboardingTopContainer } - private val actionContainer: LayoutOnboardingContainerBottomBinding by lazy { claimBinding.onboardingActionContainer } + private val actionContainer: LayoutOnboardingContainerBottomBinding by lazy { + claimBinding.onboardingActionContainer + } private val btnRefreshBalanceWidget by lazy { RefreshBalanceWidget(claimBinding.onboardingTopContainer.onboardingWalletContainer) @@ -147,8 +149,8 @@ internal class OnboardingSaltPayView( SaltPayActivationStep.Claim -> handleClaim(state) SaltPayActivationStep.ClaimInProgress -> handleClaim(state) SaltPayActivationStep.ClaimSuccess -> handleClaim(state) - SaltPayActivationStep.Success -> handleSuccess(state) - else -> {} + SaltPayActivationStep.Success -> handleSuccess() + else -> Unit } progressButton?.changeState(state.mainButtonState) } @@ -252,6 +254,7 @@ internal class OnboardingSaltPayView( progressButton = SaltPayProgressButton(root) } + @Suppress("LongMethod") private fun handleClaim(state: OnboardingSaltPayState) = with(walletFragment.bindingSaltPay) { toolbar.title = getText(R.string.onboarding_getting_started) val btnMain = actionContainer.btnContainer.findViewById(R.id.btn_main_action) @@ -325,7 +328,7 @@ internal class OnboardingSaltPayView( } } - private fun handleSuccess(state: OnboardingSaltPayState) = with(walletFragment.binding) { + private fun handleSuccess() = with(walletFragment.binding) { walletFragment.bindingSaltPay.onboardingSaltpayContainer.hide() onboardingWalletContainer.show() walletFragment.showSuccess() diff --git a/app/src/main/java/com/tangem/tap/features/onboarding/products/wallet/ui/BackupAnimator.kt b/app/src/main/java/com/tangem/tap/features/onboarding/products/wallet/ui/BackupAnimator.kt index 6453fdca92..368cb6a3a3 100644 --- a/app/src/main/java/com/tangem/tap/features/onboarding/products/wallet/ui/BackupAnimator.kt +++ b/app/src/main/java/com/tangem/tap/features/onboarding/products/wallet/ui/BackupAnimator.kt @@ -34,6 +34,8 @@ class WalletBackupAnimator( } private var currentStep = -1 + private var firstBackupCardAnimated = false + private var secondBackupCardAnimated = false override fun updateBackupState(backupState: BackupState) { } @@ -64,6 +66,7 @@ class WalletBackupAnimator( cardsWidget.toFolded() } + @Suppress("MagicNumber") override fun showAddBackupCards(state: BackupState, backupCardsCounts: Int) { when (backupCardsCounts) { 0 -> { @@ -101,6 +104,7 @@ class WalletBackupAnimator( currentStep = STEP_ADD_BACKUP_CARDS } + @Suppress("MagicNumber") override fun showWritePrimaryCard(state: BackupState) { currentStep = STEP_WRITE_PRIMARY_CARD @@ -112,9 +116,7 @@ class WalletBackupAnimator( ) } - private var firstBackupCardAnimated = false - private var secondBackupCardAnimated = false - + @Suppress("MagicNumber") override fun showWriteBackupCard(state: BackupState, backupCard: Int) { when (viewState) { State.TwoCards -> { @@ -244,6 +246,7 @@ class TestBackupAnimation( init(binding, this) } + @Suppress("MagicNumber") fun setStep(step: Int, onStepUpdate: (Int) -> Unit = {}) { steps = step when (steps) { diff --git a/app/src/main/java/com/tangem/tap/features/onboarding/products/wallet/ui/OnboardingWalletFragment.kt b/app/src/main/java/com/tangem/tap/features/onboarding/products/wallet/ui/OnboardingWalletFragment.kt index f07087c1fb..4086da388e 100644 --- a/app/src/main/java/com/tangem/tap/features/onboarding/products/wallet/ui/OnboardingWalletFragment.kt +++ b/app/src/main/java/com/tangem/tap/features/onboarding/products/wallet/ui/OnboardingWalletFragment.kt @@ -18,9 +18,9 @@ import com.google.android.material.bottomsheet.BottomSheetBehavior import com.google.android.material.tabs.TabLayoutMediator import com.tangem.common.CardIdFormatter import com.tangem.common.core.CardIdDisplayFormat +import com.tangem.core.analytics.Analytics import com.tangem.tangem_sdk_new.ui.widget.leapfrogWidget.LeapfrogWidget import com.tangem.tangem_sdk_new.ui.widget.leapfrogWidget.PropertyCalculator -import com.tangem.core.analytics.Analytics import com.tangem.tap.common.analytics.events.Onboarding import com.tangem.tap.common.extensions.hide import com.tangem.tap.common.extensions.inflate @@ -46,6 +46,7 @@ import com.tangem.wallet.databinding.LayoutOnboardingSaltpayBinding import com.tangem.wallet.databinding.ViewOnboardingProgressBinding import org.rekotlin.StoreSubscriber +@Suppress("LargeClass", "MagicNumber") class OnboardingWalletFragment : BaseFragment(R.layout.fragment_onboarding_wallet), StoreSubscriber, FragmentOnBackPressedHandler { diff --git a/app/src/main/java/com/tangem/tap/features/onboarding/products/wallet/ui/WalletCardsWidget.kt b/app/src/main/java/com/tangem/tap/features/onboarding/products/wallet/ui/WalletCardsWidget.kt index 7d4831c434..7385c4d025 100644 --- a/app/src/main/java/com/tangem/tap/features/onboarding/products/wallet/ui/WalletCardsWidget.kt +++ b/app/src/main/java/com/tangem/tap/features/onboarding/products/wallet/ui/WalletCardsWidget.kt @@ -88,6 +88,7 @@ class WalletCardsWidget( return getCardTypesTypes().map { createCardAnimator(it, propertyFactory(it)) } } + @Suppress("MagicNumber") private fun getCardTypesTypes(): List = when (leapfrogWidget.getViewsCount()) { 2 -> listOf(BackupCardType.ORIGIN, BackupCardType.FIRST_BACKUP) 3 -> listOf(BackupCardType.ORIGIN, BackupCardType.FIRST_BACKUP, BackupCardType.SECOND_BACKUP) @@ -114,6 +115,7 @@ class WalletCardsWidget( return animator } + @Suppress("MagicNumber") private fun createWelcomeProperties(cardType: BackupCardType): CardProperties { return when (cardType) { BackupCardType.ORIGIN -> CardProperties( @@ -140,6 +142,7 @@ class WalletCardsWidget( } } + @Suppress("MagicNumber") private fun createFanProperties(cardType: BackupCardType): CardProperties { return when (cardType) { BackupCardType.ORIGIN -> CardProperties( @@ -166,6 +169,7 @@ class WalletCardsWidget( } } + @Suppress("MagicNumber") private fun createLeapfrogProperties(cardType: BackupCardType): CardProperties { return when (cardType) { BackupCardType.ORIGIN -> CardProperties( @@ -192,17 +196,6 @@ class WalletCardsWidget( } } - private fun createActivateProperties(cardType: BackupCardType): CardProperties { - val topOfAnchorView = getTopOfAnchorViewForActivateState() - val twinProperties = CardProperties.from(getLeapViewByCard(cardType).state) - return twinProperties.copy( - xTranslation = twinProperties.xTranslation, - yTranslation = twinProperties.yTranslation - topOfAnchorView, - rotation = 0f, - scale = twinProperties.scale - 0.4f, - ) - } - @Throws(UnsupportedOperationException::class) fun getOriginCardView(): ImageView { return getLeapViewByCard(BackupCardType.ORIGIN).view as ImageView @@ -218,6 +211,7 @@ class WalletCardsWidget( return getLeapViewByCard(BackupCardType.SECOND_BACKUP).view as ImageView } + @Suppress("MagicNumber") @Throws(UnsupportedOperationException::class) private fun getLeapViewByCard(cardType: BackupCardType): LeapView { fun getByIndex(index: Int): LeapView { diff --git a/app/src/main/java/com/tangem/tap/features/onboarding/products/wallet/ui/dialogs/AddMoreBackupCardsDialog.kt b/app/src/main/java/com/tangem/tap/features/onboarding/products/wallet/ui/dialogs/AddMoreBackupCardsDialog.kt index d98e9907b9..950a2eb59e 100644 --- a/app/src/main/java/com/tangem/tap/features/onboarding/products/wallet/ui/dialogs/AddMoreBackupCardsDialog.kt +++ b/app/src/main/java/com/tangem/tap/features/onboarding/products/wallet/ui/dialogs/AddMoreBackupCardsDialog.kt @@ -7,22 +7,20 @@ import com.tangem.tap.features.onboarding.products.wallet.redux.BackupAction import com.tangem.tap.store import com.tangem.wallet.R -class AddMoreBackupCardsDialog { - companion object { - fun create(context: Context): AlertDialog { - return AlertDialog.Builder(context).apply { - setTitle(R.string.common_warning) - setMessage(R.string.onboarding_alert_message_not_max_backup_cards_added) - setPositiveButton(R.string.common_continue) { _, _ -> - store.dispatch(BackupAction.ShowAccessCodeInfoScreen) - } - setNegativeButton(R.string.common_cancel) { _, _ -> +object AddMoreBackupCardsDialog { + fun create(context: Context): AlertDialog { + return AlertDialog.Builder(context).apply { + setTitle(R.string.common_warning) + setMessage(R.string.onboarding_alert_message_not_max_backup_cards_added) + setPositiveButton(R.string.common_continue) { _, _ -> + store.dispatch(BackupAction.ShowAccessCodeInfoScreen) + } + setNegativeButton(R.string.common_cancel) { _, _ -> - } - setOnDismissListener { - store.dispatch(GlobalAction.HideDialog) - } - }.create() - } + } + setOnDismissListener { + store.dispatch(GlobalAction.HideDialog) + } + }.create() } } \ No newline at end of file diff --git a/app/src/main/java/com/tangem/tap/features/onboarding/products/wallet/ui/dialogs/BackupInProgressDialog.kt b/app/src/main/java/com/tangem/tap/features/onboarding/products/wallet/ui/dialogs/BackupInProgressDialog.kt index e4fa7525b5..ed4e32a0a4 100644 --- a/app/src/main/java/com/tangem/tap/features/onboarding/products/wallet/ui/dialogs/BackupInProgressDialog.kt +++ b/app/src/main/java/com/tangem/tap/features/onboarding/products/wallet/ui/dialogs/BackupInProgressDialog.kt @@ -6,19 +6,17 @@ import com.tangem.tap.common.redux.global.GlobalAction import com.tangem.tap.store import com.tangem.wallet.R -class BackupInProgressDialog { - companion object { - fun create(context: Context): AlertDialog { - return AlertDialog.Builder(context).apply { - setTitle(R.string.common_warning) - setMessage(R.string.onboarding_backup_exit_warning) - setPositiveButton(R.string.warning_button_ok) { _, _ -> - store.dispatch(GlobalAction.HideDialog) - } - setOnDismissListener { - store.dispatch(GlobalAction.HideDialog) - } - }.create() - } +object BackupInProgressDialog { + fun create(context: Context): AlertDialog { + return AlertDialog.Builder(context).apply { + setTitle(R.string.common_warning) + setMessage(R.string.onboarding_backup_exit_warning) + setPositiveButton(R.string.warning_button_ok) { _, _ -> + store.dispatch(GlobalAction.HideDialog) + } + setOnDismissListener { + store.dispatch(GlobalAction.HideDialog) + } + }.create() } } \ No newline at end of file diff --git a/app/src/main/java/com/tangem/tap/features/onboarding/products/wallet/ui/dialogs/ConfirmDiscardingBackupDialog.kt b/app/src/main/java/com/tangem/tap/features/onboarding/products/wallet/ui/dialogs/ConfirmDiscardingBackupDialog.kt index 4d35050937..557c955bb1 100644 --- a/app/src/main/java/com/tangem/tap/features/onboarding/products/wallet/ui/dialogs/ConfirmDiscardingBackupDialog.kt +++ b/app/src/main/java/com/tangem/tap/features/onboarding/products/wallet/ui/dialogs/ConfirmDiscardingBackupDialog.kt @@ -7,23 +7,21 @@ import com.tangem.tap.features.onboarding.products.wallet.redux.BackupAction import com.tangem.tap.store import com.tangem.wallet.R -class ConfirmDiscardingBackupDialog { - companion object { - fun create(context: Context): AlertDialog { - return AlertDialog.Builder(context).apply { - setTitle(R.string.welcome_interrupted_backup_discard_title) - setMessage(R.string.welcome_interrupted_backup_discard_message) - setPositiveButton(R.string.welcome_interrupted_backup_discard_resume) { _, _ -> - store.dispatch(BackupAction.ResumeFoundUnfinishedBackup) - } - setNegativeButton(R.string.welcome_interrupted_backup_discard_discard) { _, _ -> - store.dispatch(BackupAction.DiscardSavedBackup) - } - setOnDismissListener { - store.dispatch(GlobalAction.HideDialog) - } - setCancelable(false) - }.create() - } +object ConfirmDiscardingBackupDialog { + fun create(context: Context): AlertDialog { + return AlertDialog.Builder(context).apply { + setTitle(R.string.welcome_interrupted_backup_discard_title) + setMessage(R.string.welcome_interrupted_backup_discard_message) + setPositiveButton(R.string.welcome_interrupted_backup_discard_resume) { _, _ -> + store.dispatch(BackupAction.ResumeFoundUnfinishedBackup) + } + setNegativeButton(R.string.welcome_interrupted_backup_discard_discard) { _, _ -> + store.dispatch(BackupAction.DiscardSavedBackup) + } + setOnDismissListener { + store.dispatch(GlobalAction.HideDialog) + } + setCancelable(false) + }.create() } } \ No newline at end of file diff --git a/app/src/main/java/com/tangem/tap/features/onboarding/products/wallet/ui/dialogs/UnfinishedBackupFoundDialog.kt b/app/src/main/java/com/tangem/tap/features/onboarding/products/wallet/ui/dialogs/UnfinishedBackupFoundDialog.kt index d13afaa088..6576a36fce 100644 --- a/app/src/main/java/com/tangem/tap/features/onboarding/products/wallet/ui/dialogs/UnfinishedBackupFoundDialog.kt +++ b/app/src/main/java/com/tangem/tap/features/onboarding/products/wallet/ui/dialogs/UnfinishedBackupFoundDialog.kt @@ -8,22 +8,20 @@ import com.tangem.tap.features.onboarding.products.wallet.redux.BackupDialog import com.tangem.tap.store import com.tangem.wallet.R -class UnfinishedBackupFoundDialog { - companion object { - fun create(context: Context): AlertDialog { - return AlertDialog.Builder(context).apply { - setTitle(R.string.common_warning) - setMessage(R.string.welcome_interrupted_backup_alert_message) - setPositiveButton(R.string.welcome_interrupted_backup_alert_resume) { _, _ -> - store.dispatch(GlobalAction.HideDialog) - store.dispatch(BackupAction.ResumeFoundUnfinishedBackup) - } - setNegativeButton(R.string.welcome_interrupted_backup_alert_discard) { _, _ -> - store.dispatch(GlobalAction.HideDialog) - store.dispatch(GlobalAction.ShowDialog(BackupDialog.ConfirmDiscardingBackup)) - } - setCancelable(false) - }.create() - } +object UnfinishedBackupFoundDialog { + fun create(context: Context): AlertDialog { + return AlertDialog.Builder(context).apply { + setTitle(R.string.common_warning) + setMessage(R.string.welcome_interrupted_backup_alert_message) + setPositiveButton(R.string.welcome_interrupted_backup_alert_resume) { _, _ -> + store.dispatch(GlobalAction.HideDialog) + store.dispatch(BackupAction.ResumeFoundUnfinishedBackup) + } + setNegativeButton(R.string.welcome_interrupted_backup_alert_discard) { _, _ -> + store.dispatch(GlobalAction.HideDialog) + store.dispatch(GlobalAction.ShowDialog(BackupDialog.ConfirmDiscardingBackup)) + } + setCancelable(false) + }.create() } } \ No newline at end of file diff --git a/app/src/main/java/com/tangem/tap/features/send/redux/SendScreenAction.kt b/app/src/main/java/com/tangem/tap/features/send/redux/SendScreenAction.kt index 41b3f9d34a..64a01578f1 100644 --- a/app/src/main/java/com/tangem/tap/features/send/redux/SendScreenAction.kt +++ b/app/src/main/java/com/tangem/tap/features/send/redux/SendScreenAction.kt @@ -26,11 +26,11 @@ interface SendScreenActionUi : SendScreenAction object ReleaseSendState : Action data class PrepareSendScreen( - val coinAmount: Amount?, - val coinRate: BigDecimal?, - val walletManager: WalletManager?, - val tokenAmount: Amount? = null, - val tokenRate: BigDecimal? = null + val coinAmount: Amount?, + val coinRate: BigDecimal?, + val walletManager: WalletManager?, + val tokenAmount: Amount? = null, + val tokenRate: BigDecimal? = null, ) : SendScreenAction // Address or PayId @@ -44,18 +44,17 @@ sealed class AddressPayIdActionUi : SendScreenActionUi { data class ChangePayIdState(val sendingToPayIdEnabled: Boolean) : AddressPayIdActionUi() } - sealed class TransactionExtrasAction : SendScreenActionUi { data class Prepare( - val blockchain: Blockchain, - val walletAddress: String, - val xrpTag: String?, + val blockchain: Blockchain, + val walletAddress: String, + val xrpTag: String?, ) : TransactionExtrasAction() object Release : TransactionExtrasAction() sealed class XlmMemo : TransactionExtrasAction() { - // data class ChangeSelectedMemo(val memoType: XlmMemoType) : XlmMemo() + // data class ChangeSelectedMemo(val memoType: XlmMemoType) : XlmMemo() data class HandleUserInput(val data: String) : XlmMemo() } @@ -81,7 +80,11 @@ sealed class AddressPayIdVerifyAction : SendScreenAction { sealed class PayIdVerification : AddressPayIdVerifyAction() { data class SetPayIdError(val error: Error?) : PayIdVerification() - data class SetPayIdWalletAddress(val payId: String, val payIdWalletAddress: String, val isUserInput: Boolean) : PayIdVerification() + data class SetPayIdWalletAddress( + val payId: String, + val payIdWalletAddress: String, + val isUserInput: Boolean, + ) : PayIdVerification() } sealed class AddressVerification : AddressPayIdVerifyAction() { @@ -121,9 +124,9 @@ sealed class FeeAction : SendScreenAction { } data class ChangeLayoutVisibility( - val main: Boolean? = null, - val controls: Boolean? = null, - val chipGroup: Boolean? = null, + val main: Boolean? = null, + val controls: Boolean? = null, + val chipGroup: Boolean? = null, ) : FeeAction() } @@ -147,14 +150,14 @@ sealed class SendAction : SendScreenAction { sealed class Dialog : SendAction(), StateDialog { data class TezosWarningDialog( - val reduceCallback: () -> Unit, - val sendAllCallback: () -> Unit, - val reduceAmount: BigDecimal, + val reduceCallback: () -> Unit, + val sendAllCallback: () -> Unit, + val reduceAmount: BigDecimal, ) : Dialog() sealed class SendTransactionFails : Dialog() { - data class CardSdkError(val error: TangemSdkError): Dialog() - data class BlockchainSdkError(val error: com.tangem.blockchain.common.BlockchainSdkError): Dialog() + data class CardSdkError(val error: TangemSdkError) : Dialog() + data class BlockchainSdkError(val error: com.tangem.blockchain.common.BlockchainSdkError) : Dialog() } data class RequestFeeError( @@ -173,7 +176,6 @@ sealed class SendAction : SendScreenAction { data class SendSpecificTransaction( val sendAmount: String, val destinationAddress: String, - val transactionId: String + val transactionId: String, ) : SendAction() - } \ No newline at end of file diff --git a/app/src/main/java/com/tangem/tap/features/send/redux/middlewares/RequestFeeMiddleware.kt b/app/src/main/java/com/tangem/tap/features/send/redux/middlewares/RequestFeeMiddleware.kt index f73c2c3241..8a0b096c4c 100644 --- a/app/src/main/java/com/tangem/tap/features/send/redux/middlewares/RequestFeeMiddleware.kt +++ b/app/src/main/java/com/tangem/tap/features/send/redux/middlewares/RequestFeeMiddleware.kt @@ -1,7 +1,6 @@ package com.tangem.tap.features.send.redux.middlewares import com.tangem.blockchain.common.Amount -import com.tangem.blockchain.common.Blockchain import com.tangem.blockchain.common.BlockchainSdkError import com.tangem.blockchain.common.TransactionSender import com.tangem.blockchain.extensions.Result @@ -82,33 +81,4 @@ class RequestFeeMiddleware { } } } -} - -class FeeMock { - companion object { - suspend fun getFee(blockchain: Blockchain): List { - return feeStandard(blockchain) -// return feeSingle(blockchain) -// return feeStellar(blockchain) -// return feeZero(blockchain) - } - - suspend fun feeStellar(blockchain: Blockchain): List = listOf(Amount(0.0001.toBigDecimal(), blockchain)) - - suspend fun feeZero(blockchain: Blockchain): List = listOf(Amount(BigDecimal.ZERO, blockchain)) - - suspend fun feeStandard(blockchain: Blockchain): List = listOf( - Amount(0.001500.toBigDecimal(), blockchain), - Amount(0.0030.toBigDecimal(), blockchain), - Amount(0.0045001.toBigDecimal(), blockchain), - ) - - suspend fun feeStandardBig(blockchain: Blockchain): List = listOf( - Amount(1.76.toBigDecimal(), blockchain), - Amount(2.30.toBigDecimal(), blockchain), - Amount(3.45.toBigDecimal(), blockchain), - ) - - suspend fun feeSingle(blockchain: Blockchain): List = listOf(Amount(0.0015.toBigDecimal(), blockchain)) - } } \ No newline at end of file diff --git a/app/src/main/java/com/tangem/tap/features/send/redux/middlewares/SendMiddleware.kt b/app/src/main/java/com/tangem/tap/features/send/redux/middlewares/SendMiddleware.kt index 7467b27720..45801327ea 100644 --- a/app/src/main/java/com/tangem/tap/features/send/redux/middlewares/SendMiddleware.kt +++ b/app/src/main/java/com/tangem/tap/features/send/redux/middlewares/SendMiddleware.kt @@ -13,11 +13,11 @@ import com.tangem.blockchain.common.WalletManager import com.tangem.blockchain.extensions.SimpleResult import com.tangem.common.core.TangemSdkError import com.tangem.common.services.Result +import com.tangem.core.analytics.Analytics import com.tangem.domain.common.CardDTO import com.tangem.domain.common.TapWorkarounds.isStart2Coin import com.tangem.domain.common.extensions.withMainContext import com.tangem.tap.DELAY_SDK_DIALOG_CLOSE -import com.tangem.core.analytics.Analytics import com.tangem.tap.common.analytics.events.AnalyticsParam import com.tangem.tap.common.analytics.events.Token import com.tangem.tap.common.extensions.dispatchDialogShow @@ -145,6 +145,7 @@ private fun verifyAndSendTransaction( } } +@Suppress("LongParameterList", "LongMethod", "ComplexMethod") private fun sendTransaction( action: SendActionUi.SendAmountToRecipient, walletManager: WalletManager, @@ -235,7 +236,7 @@ private fun sendTransaction( } scope.launch(Dispatchers.IO) { updateWallet(walletManager) - delay(11000) // more than 10000 to avoid throttling + delay(timeMillis = 11000) // more than 10000 to avoid throttling updateWallet(walletManager) } } @@ -246,13 +247,13 @@ private fun sendTransaction( feeAmount = feeAmount, destinationAddress = destinationAddress, ) - val error = (sendResult.error as? BlockchainSdkError) ?: return@withMainContext + val error = sendResult.error as? BlockchainSdkError ?: return@withMainContext Analytics.send(Token.Send.TransactionSent(currencyType, error)) when (error) { is BlockchainSdkError.WrappedTangemError -> { - val tangemSdkError = (error.tangemError as? TangemSdkError) ?: return@withMainContext + val tangemSdkError = error.tangemError as? TangemSdkError ?: return@withMainContext if (tangemSdkError is TangemSdkError.UserCancelled) return@withMainContext dispatch(SendAction.Dialog.SendTransactionFails.CardSdkError(tangemSdkError)) diff --git a/app/src/main/java/com/tangem/tap/features/send/redux/reducers/AddressPayIdReducer.kt b/app/src/main/java/com/tangem/tap/features/send/redux/reducers/AddressPayIdReducer.kt index faf6f1b4b0..ddacac0df8 100644 --- a/app/src/main/java/com/tangem/tap/features/send/redux/reducers/AddressPayIdReducer.kt +++ b/app/src/main/java/com/tangem/tap/features/send/redux/reducers/AddressPayIdReducer.kt @@ -19,7 +19,11 @@ class AddressPayIdReducer : SendInternalReducer { else -> sendState } - private fun handleUiAction(action: AddressPayIdActionUi, sendState: SendState, state: AddressPayIdState): SendState { + private fun handleUiAction( + action: AddressPayIdActionUi, + sendState: SendState, + state: AddressPayIdState, + ): SendState { val result = when (action) { is AddressPayIdActionUi.HandleUserInput -> state is AddressPayIdActionUi.SetTruncateHandler -> state.copy(truncateHandler = action.handler) @@ -35,24 +39,28 @@ class AddressPayIdReducer : SendInternalReducer { return updateLastState(sendState.copy(addressPayIdState = result), result) } - private fun handleAction(action: AddressPayIdVerifyAction, sendState: SendState, state: AddressPayIdState): SendState { + private fun handleAction( + action: AddressPayIdVerifyAction, + sendState: SendState, + state: AddressPayIdState, + ): SendState { val result = when (action) { is PayIdVerification.SetPayIdWalletAddress -> { state.copy( - viewFieldValue = InputViewValue(action.payId, action.isUserInput), - normalFieldValue = action.payId, - truncatedFieldValue = state.truncate(action.payId), - destinationWalletAddress = action.payIdWalletAddress, - error = null + viewFieldValue = InputViewValue(action.payId, action.isUserInput), + normalFieldValue = action.payId, + truncatedFieldValue = state.truncate(action.payId), + destinationWalletAddress = action.payIdWalletAddress, + error = null, ) } is AddressVerification.SetWalletAddress -> { state.copy( - viewFieldValue = InputViewValue(action.address, action.isUserInput), - normalFieldValue = action.address, - truncatedFieldValue = state.truncate(action.address), - destinationWalletAddress = action.address, - error = null + viewFieldValue = InputViewValue(action.address, action.isUserInput), + normalFieldValue = action.address, + truncatedFieldValue = state.truncate(action.address), + destinationWalletAddress = action.address, + error = null, ) } is AddressPayIdVerifyAction.ChangePasteBtnEnableState -> state.copy(pasteIsEnabled = action.isEnabled) diff --git a/app/src/main/java/com/tangem/tap/features/send/redux/reducers/FeeReducer.kt b/app/src/main/java/com/tangem/tap/features/send/redux/reducers/FeeReducer.kt index 3238c3b372..d0548132b9 100644 --- a/app/src/main/java/com/tangem/tap/features/send/redux/reducers/FeeReducer.kt +++ b/app/src/main/java/com/tangem/tap/features/send/redux/reducers/FeeReducer.kt @@ -21,7 +21,9 @@ class FeeReducer : SendInternalReducer { private fun handleUiAction(action: FeeActionUi, sendState: SendState, state: FeeState): SendState { val result = when (action) { - is FeeActionUi.ToggleControlsVisibility -> state.copy(controlsLayoutIsVisible = !state.controlsLayoutIsVisible) + is FeeActionUi.ToggleControlsVisibility -> { + state.copy(controlsLayoutIsVisible = !state.controlsLayoutIsVisible) + } is FeeActionUi.ChangeSelectedFee -> { val currentFee = createValueOfFeeAmount(action.feeType, state.feeList) state.copy( diff --git a/app/src/main/java/com/tangem/tap/features/send/redux/reducers/ReceiptReducer.kt b/app/src/main/java/com/tangem/tap/features/send/redux/reducers/ReceiptReducer.kt index 4d4154218c..3f403ea92c 100644 --- a/app/src/main/java/com/tangem/tap/features/send/redux/reducers/ReceiptReducer.kt +++ b/app/src/main/java/com/tangem/tap/features/send/redux/reducers/ReceiptReducer.kt @@ -37,13 +37,12 @@ class ReceiptReducer : SendInternalReducer { this.feeState = sendState.feeState return when (action) { - is RefreshReceipt -> handleRefresh(action, sendState.receiptState) + is RefreshReceipt -> handleRefresh(sendState.receiptState) else -> sendState } } - - private fun handleRefresh(action: RefreshReceipt, state: ReceiptState): SendState { + private fun handleRefresh(state: ReceiptState): SendState { val wallet = sendState.walletManager?.wallet ?: return sendState val layoutType = determineLayoutType(amountState.mainCurrency.type, amountState.typeOfAmount) @@ -55,7 +54,7 @@ class ReceiptReducer : SendInternalReducer { fiat = createFiatType(symbols, showBlank), crypto = createCryptoType(symbols, showBlank), tokenFiat = createTokenFiatType(symbols, showBlank), - tokenCrypto = createTokenCryptoType(symbols, showBlank) + tokenCrypto = createTokenCryptoType(symbols, showBlank), ) return updateLastState(sendState.copy(receiptState = result), result) } @@ -76,7 +75,7 @@ class ReceiptReducer : SendInternalReducer { feeFiat = feeFiat, totalFiat = totalFiat, willSentCrypto = amountState.amountToSendCrypto.stripZeroPlainString(), - symbols = symbols + symbols = symbols, ) } else { val totalAmountCrypto = amountState.amountToSendCrypto.plus(feeCrypto) @@ -87,7 +86,7 @@ class ReceiptReducer : SendInternalReducer { feeFiat = feeFiat, totalFiat = totalFiat, willSentCrypto = totalAmountCrypto.stripZeroPlainString(), - symbols = symbols + symbols = symbols, ) } } @@ -106,7 +105,7 @@ class ReceiptReducer : SendInternalReducer { totalCrypto = amountState.amountToSendCrypto.stripZeroPlainString(), feeFiat = feeFiat, willSentFiat = convertToFiatPrecision(amountState.amountToSendCrypto), - symbols = symbols + symbols = symbols, ) } else { val totalCrypto = amountState.amountToSendCrypto.plus(feeCrypto) @@ -116,7 +115,7 @@ class ReceiptReducer : SendInternalReducer { totalCrypto = totalCrypto.stripZeroPlainString(), feeFiat = feeFiat, willSentFiat = convertToFiatPrecision(totalCrypto), - symbols = symbols + symbols = symbols, ) } } @@ -140,7 +139,7 @@ class ReceiptReducer : SendInternalReducer { totalFiat = totalFiat.scaleToFiat(true).stripZeroPlainString(), willSentToken = tokensToSend.stripZeroPlainString(), willSentFeeCoin = feeCoin.stripZeroPlainString(), - symbols = symbols + symbols = symbols, ) } else { ReceiptTokenFiat( @@ -149,7 +148,7 @@ class ReceiptReducer : SendInternalReducer { totalFiat = UNKNOWN_AMOUNT_SIGN, willSentToken = tokensToSend.stripZeroPlainString(), willSentFeeCoin = feeCoin.stripZeroPlainString(), - symbols = symbols + symbols = symbols, ) } } @@ -170,17 +169,16 @@ class ReceiptReducer : SendInternalReducer { amountToken = tokensToSend.stripZeroPlainString(), feeCoin = feeCoin.stripZeroPlainString().addPrecisionSign(), totalFiat = totalFiat.scaleToFiat(true).stripZeroPlainString(), - symbols = symbols + symbols = symbols, ) } else { ReceiptTokenCrypto( amountToken = tokensToSend.stripZeroPlainString(), feeCoin = feeCoin.stripZeroPlainString().addPrecisionSign(), totalFiat = UNKNOWN_AMOUNT_SIGN, - symbols = symbols + symbols = symbols, ) } - } private fun determineSymbols(wallet: Wallet, amountType: AmountType): ReceiptSymbols { @@ -190,7 +188,7 @@ class ReceiptReducer : SendInternalReducer { token = when (amountType) { is AmountType.Token -> amountType.token.symbol else -> null - } + }, ) } @@ -211,9 +209,15 @@ class ReceiptReducer : SendInternalReducer { private fun convertToFiatPrecision(value: BigDecimal, isToken: Boolean = false): String { return when { - !isToken && sendState.coinIsConvertible() -> sendState.coinConverter!!.toFiatWithPrecision(value).stripZeroPlainString() - isToken && sendState.tokenIsConvertible() -> sendState.tokenConverter!!.toFiatWithPrecision(value).stripZeroPlainString() - else -> UNKNOWN_AMOUNT_SIGN + !isToken && sendState.coinIsConvertible() -> { + sendState.coinConverter!!.toFiatWithPrecision(value).stripZeroPlainString() + } + isToken && sendState.tokenIsConvertible() -> { + sendState.tokenConverter!!.toFiatWithPrecision(value).stripZeroPlainString() + } + else -> { + UNKNOWN_AMOUNT_SIGN + } } } diff --git a/app/src/main/java/com/tangem/tap/features/send/redux/reducers/SendScreenReducer.kt b/app/src/main/java/com/tangem/tap/features/send/redux/reducers/SendScreenReducer.kt index d44a27f0d1..ba22cc2af8 100644 --- a/app/src/main/java/com/tangem/tap/features/send/redux/reducers/SendScreenReducer.kt +++ b/app/src/main/java/com/tangem/tap/features/send/redux/reducers/SendScreenReducer.kt @@ -28,25 +28,23 @@ interface SendInternalReducer { fun handle(action: SendScreenAction, sendState: SendState): SendState } -class SendScreenReducer { - companion object { - fun reduce(incomingAction: Action, sendState: SendState): SendState { - if (incomingAction is ReleaseSendState) return SendState() - val action = incomingAction as? SendScreenAction ?: return sendState +object SendScreenReducer { + fun reduce(incomingAction: Action, sendState: SendState): SendState { + if (incomingAction is ReleaseSendState) return SendState() + val action = incomingAction as? SendScreenAction ?: return sendState - val reducer: SendInternalReducer = when (action) { - is PrepareSendScreen -> PrepareSendScreenStatesReducer() - is AddressPayIdActionUi, is AddressPayIdVerifyAction -> AddressPayIdReducer() - is TransactionExtrasAction -> TransactionExtrasReducer() - is AmountActionUi, is AmountAction -> AmountReducer() - is FeeActionUi, is FeeAction -> FeeReducer() - is ReceiptAction -> ReceiptReducer() - is SendAction -> SendReducer() - else -> EmptyReducer() - } - - return reducer.handle(action, sendState) + val reducer: SendInternalReducer = when (action) { + is PrepareSendScreen -> PrepareSendScreenStatesReducer() + is AddressPayIdActionUi, is AddressPayIdVerifyAction -> AddressPayIdReducer() + is TransactionExtrasAction -> TransactionExtrasReducer() + is AmountActionUi, is AmountAction -> AmountReducer() + is FeeActionUi, is FeeAction -> FeeReducer() + is ReceiptAction -> ReceiptReducer() + is SendAction -> SendReducer() + else -> EmptyReducer() } + + return reducer.handle(action, sendState) } } @@ -70,19 +68,19 @@ private class SendReducer : SendInternalReducer { } private fun handleSendSpecificTransactionAction( - action: SendAction.SendSpecificTransaction, state: SendState + action: SendAction.SendSpecificTransaction, state: SendState, ): SendState { return state.copy( externalTransactionData = ExternalTransactionData(action.sendAmount, action.destinationAddress, action.transactionId), feeState = state.feeState.copy( - includeFeeSwitcherIsEnabled = false + includeFeeSwitcherIsEnabled = false, ), amountState = state.amountState.copy( - inputIsEnabled = false + inputIsEnabled = false, ), addressPayIdState = state.addressPayIdState.copy( - inputIsEnabled = false + inputIsEnabled = false, ), ) } @@ -100,17 +98,17 @@ private class PrepareSendScreenStatesReducer : SendInternalReducer { val decimals = amountToExtract.decimals return sendState.copy( - walletManager = walletManager, - coinConverter = action.coinRate?.let { CurrencyConverter(it, decimals) }, - tokenConverter = action.tokenRate?.let { CurrencyConverter(it, decimals) }, - amountState = sendState.amountState.copy( - amountToExtract = amountToExtract, - typeOfAmount = amountToExtract.type, - balanceCrypto = amountToExtract.value ?: BigDecimal.ZERO - ), - feeState = sendState.feeState.copy( - includeFeeSwitcherIsEnabled = amountToExtract.type == AmountType.Coin - ) + walletManager = walletManager, + coinConverter = action.coinRate?.let { CurrencyConverter(it, decimals) }, + tokenConverter = action.tokenRate?.let { CurrencyConverter(it, decimals) }, + amountState = sendState.amountState.copy( + amountToExtract = amountToExtract, + typeOfAmount = amountToExtract.type, + balanceCrypto = amountToExtract.value ?: BigDecimal.ZERO, + ), + feeState = sendState.feeState.copy( + includeFeeSwitcherIsEnabled = amountToExtract.type == AmountType.Coin, + ), ) } } diff --git a/app/src/main/java/com/tangem/tap/features/send/redux/reducers/TransactionExtrasReducer.kt b/app/src/main/java/com/tangem/tap/features/send/redux/reducers/TransactionExtrasReducer.kt index 71000abec1..5265a3c789 100644 --- a/app/src/main/java/com/tangem/tap/features/send/redux/reducers/TransactionExtrasReducer.kt +++ b/app/src/main/java/com/tangem/tap/features/send/redux/reducers/TransactionExtrasReducer.kt @@ -24,7 +24,7 @@ class TransactionExtrasReducer : SendInternalReducer { override fun handle(action: SendScreenAction, sendState: SendState): SendState { return when (action) { is Prepare -> handleInitialization(action, sendState) - Release -> handleRelease(action, sendState) + Release -> handleRelease(sendState) is XlmMemo -> handleXlmMemo(action, sendState, sendState.transactionExtrasState) is BinanceMemo -> handleBinanceMemo(action, sendState, sendState.transactionExtrasState) is XrpDestinationTag -> handleXrpTag(action, sendState, sendState.transactionExtrasState) @@ -43,8 +43,10 @@ class TransactionExtrasReducer : SendInternalReducer { if (tag == null) { TransactionExtrasState(xrpDestinationTag = XrpDestinationTagState()) } else { - TransactionExtrasState(xrpDestinationTag = XrpDestinationTagState( - InputViewValue("$tag", false), tag) + TransactionExtrasState( + xrpDestinationTag = XrpDestinationTagState( + InputViewValue("$tag", false), tag, + ), ) } } else { @@ -58,7 +60,7 @@ class TransactionExtrasReducer : SendInternalReducer { return updateLastState(sendState.copy(transactionExtrasState = result), result) } - private fun handleRelease(action: SendScreenAction, sendState: SendState): SendState { + private fun handleRelease(sendState: SendState): SendState { val result = TransactionExtrasState() return updateLastState(sendState.copy(transactionExtrasState = result), result) } diff --git a/app/src/main/java/com/tangem/tap/features/send/redux/states/AddressPayIdState.kt b/app/src/main/java/com/tangem/tap/features/send/redux/states/AddressPayIdState.kt index 30fe37f60a..6d0b9bee8a 100644 --- a/app/src/main/java/com/tangem/tap/features/send/redux/states/AddressPayIdState.kt +++ b/app/src/main/java/com/tangem/tap/features/send/redux/states/AddressPayIdState.kt @@ -59,6 +59,7 @@ data class XlmMemoState( else -> XlmMemoType.TEXT } + @Suppress("MagicNumber") fun isAssignableValue(value: String): Boolean = when (determineMemoType(value)) { XlmMemoType.TEXT -> { // from org.stellar.sdk.MemoText @@ -67,7 +68,7 @@ data class XlmMemoState( XlmMemoType.ID -> { try { // from com.tangem.blockchain.blockchains.stellar.StellarMemo.toStellarSdkMemo - value.toBigInteger() in BigInteger.ZERO..(Long.MAX_VALUE.toBigInteger() * 2.toBigInteger()) + value.toBigInteger() in BigInteger.ZERO..Long.MAX_VALUE.toBigInteger() * 2.toBigInteger() } catch (ex: NumberFormatException) { false } diff --git a/app/src/main/java/com/tangem/tap/features/send/redux/states/SendState.kt b/app/src/main/java/com/tangem/tap/features/send/redux/states/SendState.kt index 98fbfa47e1..6e7d3596d6 100644 --- a/app/src/main/java/com/tangem/tap/features/send/redux/states/SendState.kt +++ b/app/src/main/java/com/tangem/tap/features/send/redux/states/SendState.kt @@ -30,19 +30,19 @@ enum class StateId { interface SendScreenState : StateType, IdStateHolder data class SendState( - val walletManager: WalletManager? = null, - val coinConverter: CurrencyConverter? = null, - val tokenConverter: CurrencyConverter? = null, - val lastChangedStates: LinkedHashSet = linkedSetOf(), - val addressPayIdState: AddressPayIdState = AddressPayIdState(), - val transactionExtrasState: TransactionExtrasState = TransactionExtrasState(), - val amountState: AmountState = AmountState(), - val feeState: FeeState = FeeState(), - val receiptState: ReceiptState = ReceiptState(), - val sendWarningsList: List = listOf(), - val sendButtonState: IndeterminateProgressButton = IndeterminateProgressButton(ButtonState.DISABLED), - val dialog: StateDialog? = null, - val externalTransactionData: ExternalTransactionData? = null + val walletManager: WalletManager? = null, + val coinConverter: CurrencyConverter? = null, + val tokenConverter: CurrencyConverter? = null, + val lastChangedStates: LinkedHashSet = linkedSetOf(), + val addressPayIdState: AddressPayIdState = AddressPayIdState(), + val transactionExtrasState: TransactionExtrasState = TransactionExtrasState(), + val amountState: AmountState = AmountState(), + val feeState: FeeState = FeeState(), + val receiptState: ReceiptState = ReceiptState(), + val sendWarningsList: List = listOf(), + val sendButtonState: IndeterminateProgressButton = IndeterminateProgressButton(ButtonState.DISABLED), + val dialog: StateDialog? = null, + val externalTransactionData: ExternalTransactionData? = null, ) : SendScreenState { override val stateId: StateId = StateId.SEND_SCREEN @@ -114,7 +114,7 @@ data class SendState( fun isReadyToRequestFee(): Boolean = addressPayIdIsReady() && amountIsReady() fun isReadyToSend(): Boolean = addressPayIdIsReady() && amountIsReady() && - store.state.sendState.feeState.isReady() + store.state.sendState.feeState.isReady() } } @@ -144,10 +144,13 @@ data class AmountState( fun isCoinAmount(): Boolean = typeOfAmount == AmountType.Coin fun createMainCurrency(type: MainCurrencyType, canSwitched: Boolean): MainCurrency { - return if (!canSwitched) MainCurrency(type, amountToExtract?.currencySymbol ?: "NONE", false) - else when (type) { - MainCurrencyType.FIAT -> MainCurrency(type, store.state.globalState.appCurrency.code) - MainCurrencyType.CRYPTO -> MainCurrency(type, amountToExtract?.currencySymbol ?: "NONE") + return if (!canSwitched) { + MainCurrency(type, amountToExtract?.currencySymbol ?: "NONE", false) + } else { + when (type) { + MainCurrencyType.FIAT -> MainCurrency(type, store.state.globalState.appCurrency.code) + MainCurrencyType.CRYPTO -> MainCurrency(type, amountToExtract?.currencySymbol ?: "NONE") + } } } @@ -166,9 +169,9 @@ enum class MainCurrencyType { } data class MainCurrency( - val type: MainCurrencyType, - val currencySymbol: String, - val isEnabled: Boolean = true + val type: MainCurrencyType, + val currencySymbol: String, + val isEnabled: Boolean = true, ) data class ExternalTransactionData( @@ -176,5 +179,5 @@ data class ExternalTransactionData( val destinationAddress: String, val transactionId: String, val canAmountBeModified: Boolean = false, - val canDestinationAddressBeModified: Boolean = false + val canDestinationAddressBeModified: Boolean = false, ) \ No newline at end of file diff --git a/app/src/main/java/com/tangem/tap/features/send/ui/SendFragment.kt b/app/src/main/java/com/tangem/tap/features/send/ui/SendFragment.kt index 5c5a0b924d..55b1211cfb 100644 --- a/app/src/main/java/com/tangem/tap/features/send/ui/SendFragment.kt +++ b/app/src/main/java/com/tangem/tap/features/send/ui/SendFragment.kt @@ -1,3 +1,5 @@ +@file:Suppress("MagicNumber") + package com.tangem.tap.features.send.ui import android.content.Context @@ -14,9 +16,9 @@ import androidx.recyclerview.widget.RecyclerView import by.kirich1409.viewbindingdelegate.viewBinding import com.google.android.material.textfield.TextInputEditText import com.tangem.Message +import com.tangem.core.analytics.Analytics import com.tangem.tangem_sdk_new.extensions.hideSoftKeyboard import com.tangem.tap.common.KeyboardObserver -import com.tangem.core.analytics.Analytics import com.tangem.tap.common.analytics.events.Token import com.tangem.tap.common.entities.FiatCurrency import com.tangem.tap.common.extensions.getFromClipboard @@ -30,10 +32,25 @@ import com.tangem.tap.common.toggleWidget.IndeterminateProgressButtonWidget import com.tangem.tap.common.toggleWidget.ViewStateWidget import com.tangem.tap.features.BaseStoreFragment import com.tangem.tap.features.addBackPressHandler -import com.tangem.tap.features.send.redux.* -import com.tangem.tap.features.send.redux.AddressPayIdActionUi.* -import com.tangem.tap.features.send.redux.AmountActionUi.* -import com.tangem.tap.features.send.redux.FeeActionUi.* +import com.tangem.tap.features.send.redux.AddressPayIdActionUi +import com.tangem.tap.features.send.redux.AddressPayIdActionUi.CheckClipboard +import com.tangem.tap.features.send.redux.AddressPayIdActionUi.PasteAddressPayId +import com.tangem.tap.features.send.redux.AddressPayIdActionUi.SetTruncateHandler +import com.tangem.tap.features.send.redux.AddressPayIdActionUi.TruncateOrRestore +import com.tangem.tap.features.send.redux.AmountAction +import com.tangem.tap.features.send.redux.AmountActionUi +import com.tangem.tap.features.send.redux.AmountActionUi.CheckAmountToSend +import com.tangem.tap.features.send.redux.AmountActionUi.SetMainCurrency +import com.tangem.tap.features.send.redux.AmountActionUi.SetMaxAmount +import com.tangem.tap.features.send.redux.AmountActionUi.ToggleMainCurrency +import com.tangem.tap.features.send.redux.FeeActionUi.ChangeIncludeFee +import com.tangem.tap.features.send.redux.FeeActionUi.ChangeSelectedFee +import com.tangem.tap.features.send.redux.FeeActionUi.ToggleControlsVisibility +import com.tangem.tap.features.send.redux.ReceiptAction +import com.tangem.tap.features.send.redux.ReleaseSendState +import com.tangem.tap.features.send.redux.SendAction +import com.tangem.tap.features.send.redux.SendActionUi +import com.tangem.tap.features.send.redux.TransactionExtrasAction import com.tangem.tap.features.send.redux.states.FeeType import com.tangem.tap.features.send.redux.states.MainCurrencyType import com.tangem.tap.features.send.ui.stateSubscribers.SendStateSubscriber @@ -45,7 +62,12 @@ import com.tangem.wallet.R import com.tangem.wallet.databinding.FragmentSendBinding import kotlinx.coroutines.ExperimentalCoroutinesApi import kotlinx.coroutines.channels.awaitClose -import kotlinx.coroutines.flow.* +import kotlinx.coroutines.flow.Flow +import kotlinx.coroutines.flow.callbackFlow +import kotlinx.coroutines.flow.debounce +import kotlinx.coroutines.flow.filter +import kotlinx.coroutines.flow.launchIn +import kotlinx.coroutines.flow.onEach import java.text.DecimalFormatSymbols /** @@ -85,13 +107,16 @@ class SendFragment : BaseStoreFragment(R.layout.fragment_send) { private fun initSendButtonStates() = with(binding) { btnSend.setOnClickListener { - store.dispatch(SendActionUi.SendAmountToRecipient( - Message(getString(R.string.initial_message_sign_header)) - )) + store.dispatch( + SendActionUi.SendAmountToRecipient( + Message(getString(R.string.initial_message_sign_header)), + ), + ) } sendBtn = IndeterminateProgressButtonWidget(btnSend, progress) } + @Suppress("MagicNumber") private fun setupAddressOrPayIdLayout() = with(binding.lSendAddressPayid) { store.dispatch(SetTruncateHandler { etAddressOrPayId.truncateMiddleWith(it, "...") }) store.dispatch(CheckClipboard(requireContext().getFromClipboard()?.toString())) @@ -100,12 +125,12 @@ class SendFragment : BaseStoreFragment(R.layout.fragment_send) { store.dispatch(TruncateOrRestore(!hasFocus)) } etAddressOrPayId.inputtedTextAsFlow() - .debounce(400) - .filter { store.state.sendState.addressPayIdState.viewFieldValue.value != it } - .onEach { - store.dispatch(AddressPayIdActionUi.HandleUserInput(it)) - } - .launchIn(mainScope) + .debounce(400) + .filter { store.state.sendState.addressPayIdState.viewFieldValue.value != it } + .onEach { + store.dispatch(AddressPayIdActionUi.HandleUserInput(it)) + } + .launchIn(mainScope) imvPaste.setOnClickListener { Analytics.send(Token.Send.ButtonPaste()) @@ -116,29 +141,29 @@ class SendFragment : BaseStoreFragment(R.layout.fragment_send) { Analytics.send(Token.Send.ButtonQRCode()) startActivityForResult( Intent(requireContext(), ScanQrCodeActivity::class.java), - ScanQrCodeActivity.SCAN_QR_REQUEST_CODE + ScanQrCodeActivity.SCAN_QR_REQUEST_CODE, ) } } private fun setupTransactionExtrasLayout() = with(binding.lSendAddressPayid) { etXlmMemo.inputtedTextAsFlow() - .debounce(400) - .filter { - val info = store.state.sendState.transactionExtrasState - info.xlmMemo?.viewFieldValue?.value != it - } - .onEach { store.dispatch(TransactionExtrasAction.XlmMemo.HandleUserInput(it)) } - .launchIn(mainScope) + .debounce(400) + .filter { + val info = store.state.sendState.transactionExtrasState + info.xlmMemo?.viewFieldValue?.value != it + } + .onEach { store.dispatch(TransactionExtrasAction.XlmMemo.HandleUserInput(it)) } + .launchIn(mainScope) etDestinationTag.inputtedTextAsFlow() - .debounce(400) - .filter { - val info = store.state.sendState.transactionExtrasState - info.xrpDestinationTag?.viewFieldValue?.value != it - } - .onEach { store.dispatch(TransactionExtrasAction.XrpDestinationTag.HandleUserInput(it)) } - .launchIn(mainScope) + .debounce(400) + .filter { + val info = store.state.sendState.transactionExtrasState + info.xrpDestinationTag?.viewFieldValue?.value != it + } + .onEach { store.dispatch(TransactionExtrasAction.XrpDestinationTag.HandleUserInput(it)) } + .launchIn(mainScope) etBinanceMemo.inputtedTextAsFlow() .debounce(400) @@ -159,10 +184,13 @@ class SendFragment : BaseStoreFragment(R.layout.fragment_send) { // Delayed launch is needed in order for the UI to be drawn and to process the sent events. // If do not use the delay, then etAmount error field is not displayed when // inserting an incorrect amount by shareUri - binding.lSendAddressPayid.imvQrCode.postDelayed({ - store.dispatch(PasteAddressPayId(scannedCode)) - store.dispatch(TruncateOrRestore(!binding.lSendAddressPayid.etAddressOrPayId.isFocused)) - }, 200) + binding.lSendAddressPayid.imvQrCode.postDelayed( + { + store.dispatch(PasteAddressPayId(scannedCode)) + store.dispatch(TruncateOrRestore(!binding.lSendAddressPayid.etAddressOrPayId.isFocused)) + }, + 200, + ) } private fun setupAmountLayout() { @@ -221,10 +249,10 @@ class SendFragment : BaseStoreFragment(R.layout.fragment_send) { } etAmountToSend.inputtedTextAsFlow() - .debounce(400) - .filter { store.state.sendState.amountState.viewAmountValue.value != it && it.isNotEmpty() } - .onEach { store.dispatch(AmountActionUi.HandleUserInput(it)) } - .launchIn(mainScope) + .debounce(400) + .filter { store.state.sendState.amountState.viewAmountValue.value != it && it.isNotEmpty() } + .onEach { store.dispatch(AmountActionUi.HandleUserInput(it)) } + .launchIn(mainScope) etAmountToSend.setOnImeActionListener(EditorInfo.IME_ACTION_DONE) { it.hideSoftKeyboard() @@ -287,7 +315,7 @@ class SendFragment : BaseStoreFragment(R.layout.fragment_send) { store.dispatch(NavigationAction.PopBackTo()) } else { store.dispatch( - WalletAction.TradeCryptoAction.FinishSelling(externalTransactionData.transactionId) + WalletAction.TradeCryptoAction.FinishSelling(externalTransactionData.transactionId), ) } } @@ -309,24 +337,22 @@ fun EditText.inputtedTextAsFlow(): Flow = callbackFlow { awaitClose { removeTextChangedListener(watcher) } } -class FeeUiHelper { - companion object { - fun toId(fee: FeeType): Int { - return when (fee) { - FeeType.SINGLE -> View.NO_ID - FeeType.LOW -> R.id.chipLow - FeeType.NORMAL -> R.id.chipNormal - FeeType.PRIORITY -> R.id.chipPriority - } +object FeeUiHelper { + fun toId(fee: FeeType): Int { + return when (fee) { + FeeType.SINGLE -> View.NO_ID + FeeType.LOW -> R.id.chipLow + FeeType.NORMAL -> R.id.chipNormal + FeeType.PRIORITY -> R.id.chipPriority } + } - fun toType(id: Int): FeeType { - return when (id) { - R.id.chipLow -> FeeType.LOW - R.id.chipNormal -> FeeType.NORMAL - R.id.chipPriority -> FeeType.PRIORITY - else -> FeeType.NORMAL - } + fun toType(id: Int): FeeType { + return when (id) { + R.id.chipLow -> FeeType.LOW + R.id.chipNormal -> FeeType.NORMAL + R.id.chipPriority -> FeeType.PRIORITY + else -> FeeType.NORMAL } } } \ No newline at end of file diff --git a/app/src/main/java/com/tangem/tap/features/send/ui/dialogs/RequestFeeErrorDialog.kt b/app/src/main/java/com/tangem/tap/features/send/ui/dialogs/RequestFeeErrorDialog.kt index 353989e76c..8da2d25445 100644 --- a/app/src/main/java/com/tangem/tap/features/send/ui/dialogs/RequestFeeErrorDialog.kt +++ b/app/src/main/java/com/tangem/tap/features/send/ui/dialogs/RequestFeeErrorDialog.kt @@ -11,22 +11,19 @@ import com.tangem.wallet.R /** [REDACTED_AUTHOR] */ -class RequestFeeErrorDialog { +object RequestFeeErrorDialog { + fun create(context: Context, dialog: SendAction.Dialog.RequestFeeError): AlertDialog { + val errorMessage = dialog.error.customMessage - companion object { - fun create(context: Context, dialog: SendAction.Dialog.RequestFeeError): AlertDialog { - val errorMessage = dialog.error.customMessage - - return AlertDialog.Builder(context).apply { - setTitle(R.string.common_fee_error) - setMessage(context.getString(R.string.alert_failed_to_send_transaction_message, errorMessage)) - setNegativeButton(R.string.alert_button_send_feedback) { _, _ -> - store.dispatch(GlobalAction.SendEmail(SendTransactionFailedEmail(errorMessage))) - } - setPositiveButton(R.string.common_retry) { _, _ -> dialog.onRetry() } - setNeutralButton(R.string.common_cancel) { _, _ -> } - setOnDismissListener { store.dispatch(SendAction.Dialog.Hide) } - }.create() - } + return AlertDialog.Builder(context).apply { + setTitle(R.string.common_fee_error) + setMessage(context.getString(R.string.alert_failed_to_send_transaction_message, errorMessage)) + setNegativeButton(R.string.alert_button_send_feedback) { _, _ -> + store.dispatch(GlobalAction.SendEmail(SendTransactionFailedEmail(errorMessage))) + } + setPositiveButton(R.string.common_retry) { _, _ -> dialog.onRetry() } + setNeutralButton(R.string.common_cancel) { _, _ -> } + setOnDismissListener { store.dispatch(SendAction.Dialog.Hide) } + }.create() } } \ No newline at end of file diff --git a/app/src/main/java/com/tangem/tap/features/send/ui/dialogs/SendTransactionFailsDialog.kt b/app/src/main/java/com/tangem/tap/features/send/ui/dialogs/SendTransactionFailsDialog.kt index 0e35552e43..600e7a99d7 100644 --- a/app/src/main/java/com/tangem/tap/features/send/ui/dialogs/SendTransactionFailsDialog.kt +++ b/app/src/main/java/com/tangem/tap/features/send/ui/dialogs/SendTransactionFailsDialog.kt @@ -16,28 +16,26 @@ import com.tangem.wallet.R /** [REDACTED_AUTHOR] */ -class SendTransactionFailsDialog { - companion object { - fun create(context: Context, dialog: SendAction.Dialog.SendTransactionFails.CardSdkError): AlertDialog { - return create(context, dialog.error.localizedDescription(context)) - } +object SendTransactionFailsDialog { + fun create(context: Context, dialog: SendAction.Dialog.SendTransactionFails.CardSdkError): AlertDialog { + return create(context, dialog.error.localizedDescription(context)) + } - fun create(context: Context, dialog: SendAction.Dialog.SendTransactionFails.BlockchainSdkError): AlertDialog { - val errorConverter = BlockchainSdkErrorConverter(context) - return create(context, errorConverter.convert(dialog.error)) - } + fun create(context: Context, dialog: SendAction.Dialog.SendTransactionFails.BlockchainSdkError): AlertDialog { + val errorConverter = BlockchainSdkErrorConverter(context) + return create(context, errorConverter.convert(dialog.error)) + } - private fun create(context: Context, errorMessage: String): AlertDialog { - return AlertDialog.Builder(context).apply { - setTitle(R.string.alert_failed_to_send_transaction_title) - setMessage(context.getString(R.string.alert_failed_to_send_transaction_message, errorMessage)) - setNeutralButton(R.string.alert_button_send_feedback) { _, _ -> - store.dispatch(GlobalAction.SendEmail(SendTransactionFailedEmail(errorMessage))) - } - setPositiveButton(R.string.common_cancel) { _, _ -> } - setOnDismissListener { store.dispatch(SendAction.Dialog.Hide) } - }.create() - } + private fun create(context: Context, errorMessage: String): AlertDialog { + return AlertDialog.Builder(context).apply { + setTitle(R.string.alert_failed_to_send_transaction_title) + setMessage(context.getString(R.string.alert_failed_to_send_transaction_message, errorMessage)) + setNeutralButton(R.string.alert_button_send_feedback) { _, _ -> + store.dispatch(GlobalAction.SendEmail(SendTransactionFailedEmail(errorMessage))) + } + setPositiveButton(R.string.common_cancel) { _, _ -> } + setOnDismissListener { store.dispatch(SendAction.Dialog.Hide) } + }.create() } } diff --git a/app/src/main/java/com/tangem/tap/features/send/ui/stateSubscribers/SendStateSubscriber.kt b/app/src/main/java/com/tangem/tap/features/send/ui/stateSubscribers/SendStateSubscriber.kt index 78bff6c996..6226a2b1a9 100644 --- a/app/src/main/java/com/tangem/tap/features/send/ui/stateSubscribers/SendStateSubscriber.kt +++ b/app/src/main/java/com/tangem/tap/features/send/ui/stateSubscribers/SendStateSubscriber.kt @@ -69,6 +69,7 @@ class SendStateSubscriber(fragment: BaseStoreFragment) : } } + @Suppress("ComplexMethod") private fun handleTransactionExtrasState(fg: SendFragment, infoState: TransactionExtrasState) = with(fg.binding.lSendAddressPayid) { @@ -220,7 +221,11 @@ class SendStateSubscriber(fragment: BaseStoreFragment) : tilAmountToSend.enableError(false) } - val filter = DecimalDigitsInputFilter(12, state.maxLengthOfAmount, state.decimalSeparator) + val filter = DecimalDigitsInputFilter( + digitsBeforeDecimal = 12, + digitsAfterDecimal = state.maxLengthOfAmount, + decimalSeparator = state.decimalSeparator, + ) etAmountToSend.filters = arrayOf(filter) val amountToSend = state.viewAmountValue if (!amountToSend.isFromUserInput) etAmountToSend.update(amountToSend.value) @@ -249,8 +254,8 @@ class SendStateSubscriber(fragment: BaseStoreFragment) : tvAmountCurrency.setTextColor(fg.getColor(textColor)) } + @Suppress("MagicNumber") private fun handleFeeState(fg: SendFragment, state: FeeState) = with(fg.binding.clNetworkFee) { -// chipGroup.fitChipsByGroupWidth() fg.view?.findViewById(R.id.clNetworkFee)?.show(state.mainLayoutIsVisible) flExpandCollapse.imvExpandCollapse.rotation = if (state.controlsLayoutIsVisible) 0f else 180f llFeeControlsContainer.show(state.controlsLayoutIsVisible) @@ -265,6 +270,7 @@ class SendStateSubscriber(fragment: BaseStoreFragment) : if (chipGroup.checkedChipId != chipId && chipId != View.NO_ID) chipGroup.check(chipId) } + @Suppress("LongMethod", "ComplexMethod") private fun handleReceiptState( fg: SendFragment, state: ReceiptState, diff --git a/app/src/main/java/com/tangem/tap/features/shop/redux/ShopAction.kt b/app/src/main/java/com/tangem/tap/features/shop/redux/ShopAction.kt index 27a4a5b9e5..219753c469 100644 --- a/app/src/main/java/com/tangem/tap/features/shop/redux/ShopAction.kt +++ b/app/src/main/java/com/tangem/tap/features/shop/redux/ShopAction.kt @@ -2,9 +2,9 @@ package com.tangem.tap.features.shop.redux import android.content.Intent import com.tangem.tap.common.redux.NotificationAction -import com.tangem.tap.common.shop.GooglePayService import com.tangem.tap.common.shop.data.ProductType import com.tangem.tap.common.shop.data.TangemProduct +import com.tangem.tap.common.shop.googlepay.GooglePayService import com.tangem.wallet.R import org.rekotlin.Action diff --git a/app/src/main/java/com/tangem/tap/features/shop/redux/ShopMiddleware.kt b/app/src/main/java/com/tangem/tap/features/shop/redux/ShopMiddleware.kt index 79f2e10a6c..22073f9236 100644 --- a/app/src/main/java/com/tangem/tap/features/shop/redux/ShopMiddleware.kt +++ b/app/src/main/java/com/tangem/tap/features/shop/redux/ShopMiddleware.kt @@ -25,6 +25,7 @@ class ShopMiddleware { } } +@Suppress("LongMethod", "ComplexMethod") private fun handle(action: Action) { val shopState = store.state.shopState @@ -49,8 +50,8 @@ private fun handle(action: Action) { store.dispatchOnMain( ShopAction.ApplyPromoCode.Success( promoCode = products.first { it.type == shopState.selectedProduct }.appliedDiscount, - products = products - ) + products = products, + ), ) } result.onFailure { store.dispatchOnMain(ShopAction.ApplyPromoCode.InvalidPromoCode) } @@ -76,7 +77,7 @@ private fun handle(action: Action) { val result = shopService.handleGooglePayResult( action.resultCode, action.data, - shopState.selectedProduct + shopState.selectedProduct, ) result.onSuccess { store.dispatchOnMain(ShopAction.BuyWithGooglePay.Success) @@ -85,7 +86,6 @@ private fun handle(action: Action) { store.dispatchOnMain(ShopAction.BuyWithGooglePay.Failure(it)) } } - } ShopAction.LoadProducts -> { scope.launch { @@ -94,7 +94,7 @@ private fun handle(action: Action) { onFailure = { Timber.e(it) store.dispatchOnMain(ShopAction.LoadProducts.Failure) - } + }, ) } } diff --git a/app/src/main/java/com/tangem/tap/features/shop/redux/ShopReducer.kt b/app/src/main/java/com/tangem/tap/features/shop/redux/ShopReducer.kt index 001c48a46f..633afe5727 100644 --- a/app/src/main/java/com/tangem/tap/features/shop/redux/ShopReducer.kt +++ b/app/src/main/java/com/tangem/tap/features/shop/redux/ShopReducer.kt @@ -2,12 +2,11 @@ package com.tangem.tap.features.shop.redux import org.rekotlin.Action -class ShopReducer { - companion object { - fun reduce(action: Action, state: ShopState): ShopState = internalReduce(action, state) - } +object ShopReducer { + fun reduce(action: Action, state: ShopState): ShopState = internalReduce(action, state) } +@Suppress("ComplexMethod") private fun internalReduce(action: Action, state: ShopState): ShopState { if (action !is ShopAction) return state @@ -15,7 +14,7 @@ private fun internalReduce(action: Action, state: ShopState): ShopState { return when (action) { is ShopAction.ApplyPromoCode -> state.copy( promoCode = action.promoCode, - promoCodeLoading = true + promoCodeLoading = true, ) ShopAction.BuyWithGooglePay -> state ShopAction.LoadProducts -> state @@ -26,15 +25,15 @@ private fun internalReduce(action: Action, state: ShopState): ShopState { } ShopAction.StartWebCheckout -> state ShopAction.ApplyPromoCode.InvalidPromoCode -> state.copy( - promoCode = null, promoCodeLoading = false + promoCode = null, promoCodeLoading = false, ) is ShopAction.ApplyPromoCode.Success -> { state.copy( promoCode = action.promoCode, availableProducts = action.products, - promoCodeLoading = false + promoCodeLoading = false, - ) + ) } is ShopAction.SelectProduct -> { state.copy( @@ -49,7 +48,6 @@ private fun internalReduce(action: Action, state: ShopState): ShopState { } ShopAction.CheckIfGooglePayAvailable.Success -> { state.copy(isGooglePayAvailable = false) // TODO: change when we add support for GPay - } is ShopAction.BuyWithGooglePay.Failure -> { state diff --git a/app/src/main/java/com/tangem/tap/features/shop/ui/ShopFragment.kt b/app/src/main/java/com/tangem/tap/features/shop/ui/ShopFragment.kt index 1f32a5305e..dd0110b605 100644 --- a/app/src/main/java/com/tangem/tap/features/shop/ui/ShopFragment.kt +++ b/app/src/main/java/com/tangem/tap/features/shop/ui/ShopFragment.kt @@ -10,9 +10,9 @@ import android.view.inputmethod.EditorInfo import android.view.inputmethod.InputMethodManager import androidx.activity.OnBackPressedCallback import by.kirich1409.viewbindingdelegate.viewBinding +import com.tangem.core.analytics.Analytics import com.tangem.tap.common.GlobalLayoutStateHandler import com.tangem.tap.common.KeyboardObserver -import com.tangem.core.analytics.Analytics import com.tangem.tap.common.analytics.events.Shop import com.tangem.tap.common.extensions.show import com.tangem.tap.common.redux.navigation.NavigationAction @@ -25,10 +25,10 @@ import com.tangem.wallet.R import com.tangem.wallet.databinding.FragmentShopBinding import org.rekotlin.StoreSubscriber - class ShopFragment : BaseStoreFragment(R.layout.fragment_shop), StoreSubscriber { private val binding: FragmentShopBinding by viewBinding(FragmentShopBinding::bind) + private var cardTranslationY = 70f lateinit var keyboardObserver: KeyboardObserver @@ -45,12 +45,15 @@ class ShopFragment : BaseStoreFragment(R.layout.fragment_shop), StoreSubscriber< super.onCreate(savedInstanceState) Analytics.send(Shop.ScreenOpened()) - activity?.onBackPressedDispatcher?.addCallback(this, object : OnBackPressedCallback(true) { - override fun handleOnBackPressed() { - store.dispatch(NavigationAction.PopBackTo()) - store.dispatch(ShopAction.ResetState) - } - }) + activity?.onBackPressedDispatcher?.addCallback( + this, + object : OnBackPressedCallback(true) { + override fun handleOnBackPressed() { + store.dispatch(NavigationAction.PopBackTo()) + store.dispatch(ShopAction.ResetState) + } + }, + ) } override fun onDestroyView() { @@ -76,7 +79,7 @@ class ShopFragment : BaseStoreFragment(R.layout.fragment_shop), StoreSubscriber< } } - private var cardTranslationY = 70f + @Suppress("MagicNumber") private fun setupCardsImages() { GlobalLayoutStateHandler(binding.imvSecond).apply { onStateChanged = { @@ -94,7 +97,6 @@ class ShopFragment : BaseStoreFragment(R.layout.fragment_shop), StoreSubscriber< detach() } } - } private fun setupProductSelection() = with(binding) { @@ -147,12 +149,14 @@ class ShopFragment : BaseStoreFragment(R.layout.fragment_shop), StoreSubscriber< if (show) imvThird.show() imvThird.animate() .translationY(translationY) - .setListener(object : AnimatorListenerAdapter() { - override fun onAnimationEnd(animation: Animator) { - super.onAnimationEnd(animation) - imvThird.show(show) - } - }) + .setListener( + object : AnimatorListenerAdapter() { + override fun onAnimationEnd(animation: Animator) { + super.onAnimationEnd(animation) + imvThird.show(show) + } + }, + ) } private fun handlePriceState(state: ShopState) = with(binding) { diff --git a/app/src/main/java/com/tangem/tap/features/tokens/addCustomToken/compose/AddCustomTokenScreen.kt b/app/src/main/java/com/tangem/tap/features/tokens/addCustomToken/compose/AddCustomTokenScreen.kt index cfa3c7a5b8..fe5f66f086 100644 --- a/app/src/main/java/com/tangem/tap/features/tokens/addCustomToken/compose/AddCustomTokenScreen.kt +++ b/app/src/main/java/com/tangem/tap/features/tokens/addCustomToken/compose/AddCustomTokenScreen.kt @@ -63,11 +63,6 @@ import com.tangem.tap.features.tokens.addCustomToken.compose.test.TestCasesList import com.tangem.wallet.R import kotlinx.coroutines.launch -/** -[REDACTED_AUTHOR] - */ -private class AddCustomTokenScreen // for simple search - @OptIn(ExperimentalMaterialApi::class) @Composable fun AddCustomTokenScreen( @@ -77,7 +72,7 @@ fun AddCustomTokenScreen( val selectedTestCase = remember { mutableStateOf(TestCase.ContractAddress) } val bottomSheetScaffoldState = rememberBottomSheetScaffoldState( - bottomSheetState = BottomSheetState(BottomSheetValue.Collapsed) + bottomSheetState = BottomSheetState(BottomSheetValue.Collapsed), ) val coroutineScope = rememberCoroutineScope() val toggleBottomSheet = { coroutineScope.launch { bottomSheetScaffoldState.toggle() } } @@ -146,7 +141,7 @@ private fun ScreenContent( Column( modifier = Modifier .fillMaxWidth() - .padding(16.dp) + .padding(16.dp), ) { FormFields(state, closePopupTrigger) } @@ -197,7 +192,7 @@ fun Warnings(warnings: List) { AddCustomTokenWarning( modifier = modifier.fillMaxWidth(), warning = item, - converter = warningConverter + converter = warningConverter, ) } } @@ -208,22 +203,15 @@ private fun AddButton(state: MutableState) { AddCustomTokenFab( modifier = Modifier .widthIn(210.dp, 280.dp), - isEnabled = state.value.screenState.addButton.isEnabled + isEnabled = state.value.screenState.addButton.isEnabled, ) { domainStore.dispatch(AddCustomTokenAction.OnAddCustomTokenClicked) } } +@Suppress("MagicNumber") @Composable -private fun AddCustomTokenFab( - modifier: Modifier = Modifier, - isEnabled: Boolean = true, - onClick: () -> Unit -) { +private fun AddCustomTokenFab(modifier: Modifier = Modifier, isEnabled: Boolean = true, onClick: () -> Unit) { val contentColor = Color.White - val backgroundColor = if (isEnabled) { - Color(0xFF1ACE80) - } else { - Color(0xFFB9E6D3) - } + val backgroundColor = if (isEnabled) Color(0xFF1ACE80) else Color(0xFFB9E6D3) val elevation = if (!isEnabled) { FloatingActionButtonDefaults.elevation(0.dp, 0.dp) } else { @@ -253,19 +241,19 @@ data class ScreenFieldData( val field: DataField<*>, val error: AddCustomTokenError?, val errorConverter: ModuleMessageConverter, - val viewState: ViewStates.TokenField + val viewState: ViewStates.TokenField, ) { companion object { fun fromState( field: DataField<*>, state: AddCustomTokenState, - errorConverter: ModuleMessageConverter + errorConverter: ModuleMessageConverter, ): ScreenFieldData { return ScreenFieldData( field = field, error = state.getError(field.id), errorConverter = errorConverter, - viewState = selectField(field.id, state.screenState) + viewState = selectField(field.id, state.screenState), ) } diff --git a/app/src/main/java/com/tangem/tap/features/tokens/addCustomToken/compose/FormFieldViews.kt b/app/src/main/java/com/tangem/tap/features/tokens/addCustomToken/compose/FormFieldViews.kt index bc4c0ae9c6..7a14ca2d85 100644 --- a/app/src/main/java/com/tangem/tap/features/tokens/addCustomToken/compose/FormFieldViews.kt +++ b/app/src/main/java/com/tangem/tap/features/tokens/addCustomToken/compose/FormFieldViews.kt @@ -2,10 +2,8 @@ package com.tangem.tap.features.tokens.addCustomToken.compose import androidx.compose.foundation.text.KeyboardOptions import androidx.compose.runtime.Composable -import androidx.compose.ui.platform.LocalContext import androidx.compose.ui.res.stringResource import androidx.compose.ui.text.input.KeyboardType -import androidx.compose.ui.tooling.preview.Preview import com.tangem.core.ui.components.SpacerH8 import com.tangem.domain.common.form.Field import com.tangem.domain.features.addCustomToken.TokenBlockchainField @@ -20,12 +18,9 @@ import com.tangem.domain.features.addCustomToken.redux.AddCustomTokenAction.OnTo import com.tangem.domain.features.addCustomToken.redux.AddCustomTokenState import com.tangem.domain.redux.domainStore import com.tangem.tap.common.compose.BlockchainSpinner -import com.tangem.tap.common.compose.ClearButton import com.tangem.tap.common.compose.ClosePopupTrigger import com.tangem.tap.common.compose.OutlinedTextFieldWidget -import com.tangem.tap.common.compose.PasteButton import com.tangem.tap.common.compose.TitleSubtitle -import com.tangem.tap.common.extensions.getFromClipboard import com.tangem.wallet.R /** @@ -52,31 +47,6 @@ fun TokenContractAddressView(screenFieldData: ScreenFieldData) { SpacerH8() } -@Composable -private fun PasteClearButton( - showFirst: Boolean, -) { - if (showFirst) { - val context = LocalContext.current - PasteButton( - onClick = { - context.getFromClipboard()?.let { - val fieldData = Field.Data(it.toString(), false) - domainStore.dispatch(OnTokenContractAddressChanged(fieldData)) - } - - } - ) - } else { - ClearButton( - onClick = { - val fieldData = Field.Data("", false) - domainStore.dispatch(OnTokenContractAddressChanged(fieldData)) - } - ) - } -} - @Composable fun TokenNameView(screenFieldData: ScreenFieldData) { if (!screenFieldData.viewState.isVisible) return @@ -178,10 +148,4 @@ fun TokenDerivationPathView( closePopupTrigger = closePopupTrigger, ) { domainStore.dispatch(OnTokenDerivationPathChanged(Field.Data(it, true))) } SpacerH8() -} - -@Preview -@Composable -fun TestTokenContractAddressView() { - } \ No newline at end of file diff --git a/app/src/main/java/com/tangem/tap/features/tokens/redux/TokensMiddleware.kt b/app/src/main/java/com/tangem/tap/features/tokens/redux/TokensMiddleware.kt index 26b1e9c376..7c513d06de 100644 --- a/app/src/main/java/com/tangem/tap/features/tokens/redux/TokensMiddleware.kt +++ b/app/src/main/java/com/tangem/tap/features/tokens/redux/TokensMiddleware.kt @@ -10,6 +10,7 @@ import com.tangem.common.extensions.toMapKey import com.tangem.common.flatMap import com.tangem.common.hdWallet.DerivationPath import com.tangem.common.services.Result +import com.tangem.core.analytics.Analytics import com.tangem.domain.DomainWrapped import com.tangem.domain.common.ScanResponse import com.tangem.domain.common.TapWorkarounds.derivationStyle @@ -21,7 +22,6 @@ import com.tangem.domain.redux.domainStore import com.tangem.operations.derivation.ExtendedPublicKeysMap import com.tangem.tap.DELAY_SDK_DIALOG_CLOSE import com.tangem.tap.assetReader -import com.tangem.core.analytics.Analytics import com.tangem.tap.common.analytics.events.ManageTokens import com.tangem.tap.common.extensions.dispatchDebugErrorNotification import com.tangem.tap.common.extensions.dispatchOnMain @@ -45,6 +45,7 @@ import kotlinx.coroutines.delay import kotlinx.coroutines.launch import org.rekotlin.Middleware +@Suppress("LargeClass") class TokensMiddleware { val tokensMiddleware: Middleware = { _, _ -> @@ -96,11 +97,11 @@ class TokensMiddleware { isTestcard, supportedBlockchains, tokensState.pageToLoad, - tokensState.searchInput + tokensState.searchInput, ) } else { loadCoinsService.getSupportedTokens( - isTestcard, supportedBlockchains, 0, newSearchInput.ifBlank { null } + isTestcard, supportedBlockchains, 0, newSearchInput.ifBlank { null }, ) } when (loadCoinsResult) { @@ -143,10 +144,11 @@ class TokensMiddleware { convertToCurrencies( blockchains = blockchainsToRemove, tokens = tokensToRemove, - derivationStyle = derivationStyle - ) + derivationStyle = derivationStyle, + ), ) + @Suppress("ComplexCondition") if (tokensToAdd.isEmpty() && tokensToRemove.isEmpty() && blockchainsToAdd.isEmpty() && blockchainsToRemove.isEmpty() ) { @@ -158,7 +160,7 @@ class TokensMiddleware { val currencyList = convertToCurrencies( blockchains = blockchainsToAdd, tokens = tokensToAdd, - derivationStyle = derivationStyle + derivationStyle = derivationStyle, ) if (scanResponse.supportsHdWallet()) { deriveMissingBlockchains(scanResponse, currencyList) { @@ -174,7 +176,7 @@ class TokensMiddleware { private fun convertToCurrencies( blockchains: List, tokens: List, - derivationStyle: DerivationStyle? + derivationStyle: DerivationStyle?, ): List { return blockchains.map { Currency.Blockchain(it, it.derivationPath(derivationStyle)?.rawPath) @@ -182,7 +184,7 @@ class TokensMiddleware { Currency.Token( it.token, it.blockchain, - it.blockchain.derivationPath(derivationStyle)?.rawPath + it.blockchain.derivationPath(derivationStyle)?.rawPath, ) } } @@ -194,7 +196,7 @@ class TokensMiddleware { ) { val derivationDataList = listOfNotNull( getDerivations(EllipticCurve.Secp256k1, scanResponse, currencyList), - getDerivations(EllipticCurve.Ed25519, scanResponse, currencyList) + getDerivations(EllipticCurve.Ed25519, scanResponse, currencyList), ) val derivations = derivationDataList.associate { it.derivations } if (derivations.isEmpty()) { @@ -267,29 +269,24 @@ class TokensMiddleware { return DerivationData( derivations = mapKeyOfWalletPublicKey to toDerive, alreadyDerivedKeys = alreadyDerivedKeys, - mapKeyOfWalletPublicKey = mapKeyOfWalletPublicKey + mapKeyOfWalletPublicKey = mapKeyOfWalletPublicKey, ) } private class DerivationData( val derivations: Pair>, val alreadyDerivedKeys: ExtendedPublicKeysMap, - val mapKeyOfWalletPublicKey: ByteArrayKey + val mapKeyOfWalletPublicKey: ByteArrayKey, ) - private fun submitAdd( - scanResponse: ScanResponse, - currencyList: List, - ) { + private fun submitAdd(scanResponse: ScanResponse, currencyList: List) { val selectedUserWallet = userWalletsListManager.selectedUserWalletSync if (selectedUserWallet != null) { scope.launch { userWalletsListManager.update( userWalletId = selectedUserWallet.walletId, update = { userWallet -> - userWallet.copy( - scanResponse = scanResponse, - ) + userWallet.copy(scanResponse = scanResponse) }, ) .flatMap { updatedUserWallet -> @@ -307,7 +304,6 @@ class TokensMiddleware { when (currency) { is Currency.Blockchain -> { val derivationPath = currency.derivationPath?.let { DerivationPath(it) } - val derivationParams = derivationStyle?.let { when (derivationPath) { null -> DerivationParams.Default(derivationStyle) @@ -319,9 +315,8 @@ class TokensMiddleware { blockchain = currency.blockchain, derivationParams = derivationParams, ) ?: return@mapIndexedNotNull null - val blockchainNetwork = BlockchainNetwork.fromWalletManager(walletManager) WalletAction.MultiWallet.AddBlockchain( - blockchain = blockchainNetwork, + blockchain = BlockchainNetwork.fromWalletManager(walletManager), walletManager = walletManager, save = index == currencyList.lastIndex, ) @@ -394,12 +389,12 @@ class TokensMiddleware { when (it) { is Currency.Blockchain -> DomainWrapped.Currency.Blockchain( it.blockchain, - it.derivationPath + it.derivationPath, ) is Currency.Token -> DomainWrapped.Currency.Token( it.token, it.blockchain, - it.derivationPath + it.derivationPath, ) } } diff --git a/app/src/main/java/com/tangem/tap/features/tokens/redux/TokensReducer.kt b/app/src/main/java/com/tangem/tap/features/tokens/redux/TokensReducer.kt index 007a1e9711..336d8a7982 100644 --- a/app/src/main/java/com/tangem/tap/features/tokens/redux/TokensReducer.kt +++ b/app/src/main/java/com/tangem/tap/features/tokens/redux/TokensReducer.kt @@ -3,10 +3,8 @@ package com.tangem.tap.features.tokens.redux import com.tangem.tap.common.redux.AppState import org.rekotlin.Action -class TokensReducer { - companion object { - fun reduce(action: Action, state: AppState): TokensState = internalReduce(action, state) - } +object TokensReducer { + fun reduce(action: Action, state: AppState): TokensState = internalReduce(action, state) } private fun internalReduce(action: Action, state: AppState): TokensState { @@ -23,7 +21,7 @@ private fun internalReduce(action: Action, state: AppState): TokensState { } tokensState.copy( scanResponse = action.scanResponse, - loadCoinsState = loadingState + loadCoinsState = loadingState, ) } is TokensAction.LoadCurrencies.Success -> { @@ -31,7 +29,7 @@ private fun internalReduce(action: Action, state: AppState): TokensState { currencies = tokensState.currencies + action.currencies, needToLoadMore = action.loadMore, pageToLoad = tokensState.pageToLoad + 1, - loadCoinsState = LoadCoinsState.LOADED + loadCoinsState = LoadCoinsState.LOADED, ) } is TokensAction.SetAddedCurrencies -> { @@ -40,7 +38,7 @@ private fun internalReduce(action: Action, state: AppState): TokensState { addedBlockchains = action.wallets.toNonCustomBlockchains(action.derivationStyle), addedTokens = action.wallets.toNonCustomTokensWithBlockchains(action.derivationStyle), addedWallets = action.wallets, - derivationStyle = action.derivationStyle + derivationStyle = action.derivationStyle, ) } is TokensAction.AllowToAddTokens -> { @@ -52,7 +50,7 @@ private fun internalReduce(action: Action, state: AppState): TokensState { needToLoadMore = true, currencies = emptyList(), pageToLoad = 0, - loadCoinsState = LoadCoinsState.LOADING + loadCoinsState = LoadCoinsState.LOADING, ) } else -> tokensState diff --git a/app/src/main/java/com/tangem/tap/features/tokens/redux/TokensState.kt b/app/src/main/java/com/tangem/tap/features/tokens/redux/TokensState.kt index ab1b3731a5..5c4f723467 100644 --- a/app/src/main/java/com/tangem/tap/features/tokens/redux/TokensState.kt +++ b/app/src/main/java/com/tangem/tap/features/tokens/redux/TokensState.kt @@ -9,6 +9,7 @@ import com.tangem.domain.common.extensions.fromNetworkId import com.tangem.tap.domain.tokens.Currency import com.tangem.tap.features.wallet.redux.WalletData import org.rekotlin.StateType +import com.tangem.tap.features.wallet.models.Currency.Token as CurrencyToken data class TokensState( val addedWallets: List = emptyList(), @@ -32,18 +33,18 @@ data class TokensState( typealias ContractAddress = String fun List.toTokensContractAddresses(): List { - return mapNotNull { (it.currency as? com.tangem.tap.features.wallet.models.Currency.Token)?.token?.contractAddress }.distinct() + return mapNotNull { (it.currency as? CurrencyToken)?.token?.contractAddress }.distinct() } fun List.toNonCustomTokens(derivationStyle: DerivationStyle?): List { return filter { !it.currency.isCustomCurrency(derivationStyle) } - .mapNotNull { (it.currency as? com.tangem.tap.features.wallet.models.Currency.Token)?.token } + .mapNotNull { (it.currency as? CurrencyToken)?.token } .distinct() } fun List.toNonCustomTokensWithBlockchains(derivationStyle: DerivationStyle?): List { return mapNotNull { - if (it.currency !is com.tangem.tap.features.wallet.models.Currency.Token) return@mapNotNull null + if (it.currency !is CurrencyToken) return@mapNotNull null if (it.currency.isCustomCurrency(derivationStyle)) return@mapNotNull null TokenWithBlockchain(it.currency.token, it.currency.blockchain) }.distinct() @@ -61,17 +62,18 @@ fun List.toNonCustomBlockchains(derivationStyle: DerivationStyle?): data class TokenWithBlockchain( val token: Token, - val blockchain: Blockchain + val blockchain: Blockchain, ) fun List.filter(supportedBlockchains: Set?): List { if (supportedBlockchains == null) return this return map { - it.copy(contracts = - it.contracts.filter { - supportedBlockchains.contains(it.blockchain) && - (it.blockchain.canHandleTokens() || it.address == null) - } + it.copy( + contracts = + it.contracts.filter { + supportedBlockchains.contains(it.blockchain) && + (it.blockchain.canHandleTokens() || it.address == null) + }, ) }.filterNot { it.contracts.isNullOrEmpty() && !supportedBlockchains.contains(Blockchain.fromNetworkId(it.id)) diff --git a/app/src/main/java/com/tangem/tap/features/tokens/ui/AddTokensFragment.kt b/app/src/main/java/com/tangem/tap/features/tokens/ui/AddTokensFragment.kt index 499ed8e2f5..9f9288ea99 100644 --- a/app/src/main/java/com/tangem/tap/features/tokens/ui/AddTokensFragment.kt +++ b/app/src/main/java/com/tangem/tap/features/tokens/ui/AddTokensFragment.kt @@ -103,6 +103,7 @@ class AddTokensFragment : BaseFragment(R.layout.fragment_add_tokens), StoreSubsc super.onDestroy() } + @Suppress("MagicNumber") override fun onCreateOptionsMenu(menu: Menu, inflater: MenuInflater) { inflater.inflate(R.menu.menu_popular_tokens, menu) @@ -168,5 +169,5 @@ fun SearchView.inputtedTextAsFlow(): Flow = callbackFlow { } }, ) - awaitClose { (watcher) } + awaitClose { watcher } } \ No newline at end of file diff --git a/app/src/main/java/com/tangem/tap/features/tokens/ui/compose/CurrenciesScreen.kt b/app/src/main/java/com/tangem/tap/features/tokens/ui/compose/CurrenciesScreen.kt index 612f5d413a..371e343dda 100644 --- a/app/src/main/java/com/tangem/tap/features/tokens/ui/compose/CurrenciesScreen.kt +++ b/app/src/main/java/com/tangem/tap/features/tokens/ui/compose/CurrenciesScreen.kt @@ -1,3 +1,5 @@ +@file:Suppress("MagicNumber") + package com.tangem.tap.features.tokens.ui.compose import androidx.compose.animation.AnimatedVisibility @@ -26,12 +28,12 @@ import androidx.compose.ui.res.colorResource import androidx.compose.ui.res.stringResource import androidx.compose.ui.unit.dp import com.tangem.blockchain.common.Blockchain +import com.tangem.core.analytics.Analytics import com.tangem.core.ui.components.Keyboard import com.tangem.core.ui.components.SystemBarsEffect import com.tangem.core.ui.components.keyboardAsState import com.tangem.domain.common.TapWorkarounds.useOldStyleDerivation import com.tangem.domain.common.extensions.fromNetworkId -import com.tangem.core.analytics.Analytics import com.tangem.tap.common.analytics.events.AnalyticsParam import com.tangem.tap.common.analytics.events.ManageTokens import com.tangem.tap.common.compose.extensions.addAndNotify @@ -48,6 +50,7 @@ import com.tangem.tap.features.wallet.redux.models.WalletDialog import com.tangem.tap.store import com.tangem.wallet.R +@Suppress("LongMethod") @Composable fun CurrenciesScreen( tokensState: MutableState = mutableStateOf(store.state.tokensState), diff --git a/app/src/main/java/com/tangem/tap/features/tokens/ui/compose/CurrenciesWarning.kt b/app/src/main/java/com/tangem/tap/features/tokens/ui/compose/CurrenciesWarning.kt index b5c11c60b8..d102ebda9f 100644 --- a/app/src/main/java/com/tangem/tap/features/tokens/ui/compose/CurrenciesWarning.kt +++ b/app/src/main/java/com/tangem/tap/features/tokens/ui/compose/CurrenciesWarning.kt @@ -18,6 +18,7 @@ import androidx.compose.ui.unit.dp import androidx.compose.ui.unit.sp import com.tangem.wallet.R +@Suppress("MagicNumber") @Composable fun CurrenciesWarning() { Box( diff --git a/app/src/main/java/com/tangem/tap/features/tokens/ui/compose/ExpandedCurrencyItem.kt b/app/src/main/java/com/tangem/tap/features/tokens/ui/compose/ExpandedCurrencyItem.kt deleted file mode 100644 index e69de29bb2..0000000000 diff --git a/app/src/main/java/com/tangem/tap/features/tokens/ui/compose/ListOfCurrencies.kt b/app/src/main/java/com/tangem/tap/features/tokens/ui/compose/ListOfCurrencies.kt index 613f741c55..175d3a765a 100644 --- a/app/src/main/java/com/tangem/tap/features/tokens/ui/compose/ListOfCurrencies.kt +++ b/app/src/main/java/com/tangem/tap/features/tokens/ui/compose/ListOfCurrencies.kt @@ -19,6 +19,7 @@ import com.tangem.tap.features.tokens.redux.ContractAddress import com.tangem.tap.features.tokens.redux.TokenWithBlockchain import com.tangem.tap.features.tokens.ui.compose.currencyItem.CurrencyItem +@Suppress("LongParameterList") @Composable fun ListOfCurrencies( header: @Composable () -> Unit, diff --git a/app/src/main/java/com/tangem/tap/features/tokens/ui/compose/currencyItem/CurrencyExpandedContent.kt b/app/src/main/java/com/tangem/tap/features/tokens/ui/compose/currencyItem/CurrencyExpandedContent.kt index c4b1b21abe..0757c05100 100644 --- a/app/src/main/java/com/tangem/tap/features/tokens/ui/compose/currencyItem/CurrencyExpandedContent.kt +++ b/app/src/main/java/com/tangem/tap/features/tokens/ui/compose/currencyItem/CurrencyExpandedContent.kt @@ -15,6 +15,7 @@ import com.tangem.tap.domain.tokens.Currency import com.tangem.tap.features.tokens.redux.ContractAddress import com.tangem.tap.features.tokens.redux.TokenWithBlockchain +@Suppress("LongParameterList") @Composable fun CurrencyExpandedContent( currency: Currency, diff --git a/app/src/main/java/com/tangem/tap/features/tokens/ui/compose/currencyItem/CurrencyItem.kt b/app/src/main/java/com/tangem/tap/features/tokens/ui/compose/currencyItem/CurrencyItem.kt index 6758c71e82..2a3c458e2e 100644 --- a/app/src/main/java/com/tangem/tap/features/tokens/ui/compose/currencyItem/CurrencyItem.kt +++ b/app/src/main/java/com/tangem/tap/features/tokens/ui/compose/currencyItem/CurrencyItem.kt @@ -7,6 +7,7 @@ import com.tangem.tap.domain.tokens.Currency import com.tangem.tap.features.tokens.redux.ContractAddress import com.tangem.tap.features.tokens.redux.TokenWithBlockchain +@Suppress("LongParameterList") @Composable fun CurrencyItem( currency: Currency, diff --git a/app/src/main/java/com/tangem/tap/features/tokens/ui/compose/currencyItem/CurrencyItemArrow.kt b/app/src/main/java/com/tangem/tap/features/tokens/ui/compose/currencyItem/CurrencyItemArrow.kt index 4be02043d5..7c4ebd56e8 100644 --- a/app/src/main/java/com/tangem/tap/features/tokens/ui/compose/currencyItem/CurrencyItemArrow.kt +++ b/app/src/main/java/com/tangem/tap/features/tokens/ui/compose/currencyItem/CurrencyItemArrow.kt @@ -36,6 +36,7 @@ fun CurrencyItemArrow( } } +@Suppress("MagicNumber") @Composable private fun MiddleArrowView(rowHeight: Dp) { Box { diff --git a/app/src/main/java/com/tangem/tap/features/tokens/ui/compose/currencyItem/CurrencyItemHeader.kt b/app/src/main/java/com/tangem/tap/features/tokens/ui/compose/currencyItem/CurrencyItemHeader.kt index 32c6c7b329..c081298112 100644 --- a/app/src/main/java/com/tangem/tap/features/tokens/ui/compose/currencyItem/CurrencyItemHeader.kt +++ b/app/src/main/java/com/tangem/tap/features/tokens/ui/compose/currencyItem/CurrencyItemHeader.kt @@ -40,6 +40,7 @@ import com.tangem.tap.features.tokens.ui.compose.CurrencyPlaceholderIcon import com.tangem.tap.features.tokens.ui.compose.fullName import com.tangem.wallet.R +@Suppress("LongMethod", "MagicNumber") @Composable fun CurrencyItemHeader( currency: Currency, @@ -166,6 +167,7 @@ private fun NetworksRow( } } +@Suppress("MagicNumber") @Composable private fun BlockchainNetworkItem( blockchain: Blockchain?, diff --git a/app/src/main/java/com/tangem/tap/features/tokens/ui/compose/currencyItem/NetworkItem.kt b/app/src/main/java/com/tangem/tap/features/tokens/ui/compose/currencyItem/NetworkItem.kt index 494cbc8553..93ed42ffe7 100644 --- a/app/src/main/java/com/tangem/tap/features/tokens/ui/compose/currencyItem/NetworkItem.kt +++ b/app/src/main/java/com/tangem/tap/features/tokens/ui/compose/currencyItem/NetworkItem.kt @@ -41,6 +41,7 @@ import com.tangem.tap.features.tokens.redux.ContractAddress import com.tangem.tap.features.tokens.redux.TokenWithBlockchain import com.tangem.tap.features.tokens.ui.compose.CurrencyPlaceholderIcon +@Suppress("LongParameterList", "LongMethod", "MagicNumber") @OptIn(ExperimentalFoundationApi::class) @Composable fun NetworkItem( @@ -158,6 +159,7 @@ fun NetworkItem( } } +@Suppress("MagicNumber") @Composable private fun prepareNetworkNameSpannableText( blockchain: Blockchain, diff --git a/app/src/main/java/com/tangem/tap/features/wallet/models/WalletWarning.kt b/app/src/main/java/com/tangem/tap/features/wallet/models/WalletWarning.kt index e2709d2bb9..caafcd99c0 100644 --- a/app/src/main/java/com/tangem/tap/features/wallet/models/WalletWarning.kt +++ b/app/src/main/java/com/tangem/tap/features/wallet/models/WalletWarning.kt @@ -8,9 +8,9 @@ sealed class WalletWarning( val edStringValueWithSymbol: String, ) : WalletWarning(1) - data class TransactionInProgress(val currencyName: String) : WalletWarning(10) - data class BalanceNotEnoughForFee(val blockchainFullName: String) : WalletWarning(30) - data class Rent(val walletRent: WalletRent) : WalletWarning(40) + data class TransactionInProgress(val currencyName: String) : WalletWarning(showingPosition = 10) + data class BalanceNotEnoughForFee(val blockchainFullName: String) : WalletWarning(showingPosition = 30) + data class Rent(val walletRent: WalletRent) : WalletWarning(showingPosition = 40) } data class WalletWarningDescription( diff --git a/app/src/main/java/com/tangem/tap/features/wallet/redux/WalletState.kt b/app/src/main/java/com/tangem/tap/features/wallet/redux/WalletState.kt index b803175cf8..0e42de22a6 100644 --- a/app/src/main/java/com/tangem/tap/features/wallet/redux/WalletState.kt +++ b/app/src/main/java/com/tangem/tap/features/wallet/redux/WalletState.kt @@ -110,7 +110,7 @@ data class WalletState( if (currency == null) return null return walletsStores.firstOrNull { it.blockchainNetwork.derivationPath == currency.derivationPath && - (it.blockchainNetwork.blockchain == currency.blockchain) + it.blockchainNetwork.blockchain == currency.blockchain } } @@ -125,7 +125,7 @@ data class WalletState( if (blockchainNetwork == null) return null return walletsStores.firstOrNull { it.blockchainNetwork.derivationPath == blockchainNetwork.derivationPath && - (it.blockchainNetwork.blockchain == blockchainNetwork.blockchain) + it.blockchainNetwork.blockchain == blockchainNetwork.blockchain } } @@ -134,13 +134,6 @@ data class WalletState( return getWalletStore(currency)?.walletsData?.firstOrNull { it.currency == currency } } - private fun isPrimaryCurrency(walletData: WalletData): Boolean { - return (walletData.currency is Currency.Blockchain && - walletData.currency.blockchain == store.state.walletState.primaryBlockchain) - || (walletData.currency is Currency.Token && - walletData.currency.token == store.state.walletState.primaryToken) - } - fun replaceWalletStoreInWalletsStores(wallet: WalletStore?): List { if (wallet == null) return walletsStores var changed = false @@ -231,9 +224,9 @@ data class WalletState( fiatCurrency = store.state.globalState.appCurrency, ), ) - } else this.copy( - totalBalance = null, - ) + } else { + this.copy(totalBalance = null) + } } private fun updateProgressState(): WalletState { @@ -377,7 +370,7 @@ data class WalletData( if (!currency.isToken()) return val blockchainFullName = currency.blockchain.fullName - if ((blockchainAmountIsEmpty() && !tokenAmountIsEmpty())) { + if (blockchainAmountIsEmpty() && !tokenAmountIsEmpty()) { walletWarnings.add(WalletWarning.BalanceNotEnoughForFee(blockchainFullName)) } } diff --git a/app/src/main/java/com/tangem/tap/features/wallet/redux/middlewares/Mapper.kt b/app/src/main/java/com/tangem/tap/features/wallet/redux/middlewares/Mapper.kt index 75b79e6a61..a9b2f6fb7c 100644 --- a/app/src/main/java/com/tangem/tap/features/wallet/redux/middlewares/Mapper.kt +++ b/app/src/main/java/com/tangem/tap/features/wallet/redux/middlewares/Mapper.kt @@ -54,6 +54,7 @@ internal fun WalletStoreModel.mapToReduxModel( ) } +@Suppress("LongMethod", "ComplexMethod") private fun List.mapToReduxModel( isMultiWalletAllowed: Boolean, walletRent: WalletStoreModel.WalletRent?, @@ -93,14 +94,16 @@ private fun List.mapToReduxModel( walletRent = walletRent?.let { WalletRent( minRentValue = "${it.rent.stripZeroPlainString()} ${currency.blockchain.currency}", - rentExemptValue = "${it.exemptionAmount.stripZeroPlainString()} ${currency.blockchain.currency}", + rentExemptValue = "${it.exemptionAmount.stripZeroPlainString()} " + + currency.blockchain.currency, ) }, currencyData = BalanceWidgetData( status = when (status) { is WalletDataModel.Loading -> BalanceStatus.Loading is WalletDataModel.NoAccount -> BalanceStatus.NoAccount - is WalletDataModel.SameCurrencyTransactionInProgress -> BalanceStatus.SameCurrencyTransactionInProgress + is WalletDataModel.SameCurrencyTransactionInProgress -> + BalanceStatus.SameCurrencyTransactionInProgress is WalletDataModel.TransactionInProgress -> BalanceStatus.TransactionInProgress is WalletDataModel.Unreachable -> BalanceStatus.Unreachable is WalletDataModel.MissedDerivation -> BalanceStatus.MissedDerivation diff --git a/app/src/main/java/com/tangem/tap/features/wallet/redux/middlewares/MultiWalletMiddleware.kt b/app/src/main/java/com/tangem/tap/features/wallet/redux/middlewares/MultiWalletMiddleware.kt index 8a3aaa65c7..10b3fff7cf 100644 --- a/app/src/main/java/com/tangem/tap/features/wallet/redux/middlewares/MultiWalletMiddleware.kt +++ b/app/src/main/java/com/tangem/tap/features/wallet/redux/middlewares/MultiWalletMiddleware.kt @@ -5,8 +5,8 @@ import com.tangem.blockchain.common.Token import com.tangem.blockchain.common.WalletManager import com.tangem.common.doOnSuccess import com.tangem.common.extensions.guard -import com.tangem.domain.common.extensions.withMainContext import com.tangem.core.analytics.Analytics +import com.tangem.domain.common.extensions.withMainContext import com.tangem.tap.common.analytics.events.AnalyticsParam import com.tangem.tap.common.analytics.events.MainScreen import com.tangem.tap.common.analytics.events.Token.ButtonRemoveToken @@ -42,6 +42,7 @@ import kotlinx.coroutines.withContext import java.math.BigDecimal class MultiWalletMiddleware { + @Suppress("LongMethod", "ComplexMethod") fun handle( action: WalletAction.MultiWallet, walletState: WalletState?, globalState: GlobalState?, ) { @@ -129,11 +130,13 @@ class MultiWalletMiddleware { } is WalletAction.MultiWallet.RemoveWallet -> { val selectedUserWallet = userWalletsListManager.selectedUserWalletSync - if (selectedUserWallet != null) scope.launch { - walletCurrenciesManager.removeCurrency( - userWallet = selectedUserWallet, - currencyToRemove = action.currency, - ) + if (selectedUserWallet != null) { + scope.launch { + walletCurrenciesManager.removeCurrency( + userWallet = selectedUserWallet, + currencyToRemove = action.currency, + ) + } } else { val currency = action.currency val card = globalState.scanResponse?.card.guard { @@ -144,8 +147,9 @@ class MultiWalletMiddleware { var currencies = walletState?.currencies ?: emptyList() currencies = currencies.filterNot { it == currency } if (currency.isBlockchain()) { - currencies - .filter { it.blockchain == currency.blockchain && it.derivationPath == currency.derivationPath } + currencies.filter { + it.blockchain == currency.blockchain && it.derivationPath == currency.derivationPath + } } scope.launch { userTokensRepository.saveUserTokens(card, currencies) } } diff --git a/app/src/main/java/com/tangem/tap/features/wallet/redux/middlewares/WalletMiddleware.kt b/app/src/main/java/com/tangem/tap/features/wallet/redux/middlewares/WalletMiddleware.kt index 6142599a97..4ff0929fd3 100644 --- a/app/src/main/java/com/tangem/tap/features/wallet/redux/middlewares/WalletMiddleware.kt +++ b/app/src/main/java/com/tangem/tap/features/wallet/redux/middlewares/WalletMiddleware.kt @@ -65,6 +65,7 @@ import org.rekotlin.Middleware import timber.log.Timber import java.math.BigDecimal +@Suppress("LargeClass") class WalletMiddleware { private val tradeCryptoMiddleware = TradeCryptoMiddleware() private val warningsMiddleware = WarningsMiddleware() @@ -89,6 +90,7 @@ class WalletMiddleware { } } + @Suppress("LongMethod", "ComplexMethod") private fun handleAction(state: () -> AppState?, action: Action, dispatch: DispatchFunction) { if (DemoHelper.tryHandle(state, action)) return @@ -117,17 +119,15 @@ class WalletMiddleware { is WalletAction.LoadWallet.Success -> { checkForRentWarning(walletState.getWalletManager(action.blockchain)) val coinAmount = action.wallet.amounts[AmountType.Coin]?.value - if (coinAmount != null && !coinAmount.isZero()) { - if (walletState.getWalletData(action.blockchain) == null) { - store.dispatch( - WalletAction.MultiWallet.AddBlockchain( - action.blockchain, - null, - true, - ), - ) - store.dispatch(WalletAction.LoadWallet.Success(action.wallet, action.blockchain)) - } + if (coinAmount?.isZero() == false && walletState.getWalletData(action.blockchain) == null) { + store.dispatch( + WalletAction.MultiWallet.AddBlockchain( + blockchain = action.blockchain, + walletManager = null, + save = true, + ), + ) + store.dispatch(WalletAction.LoadWallet.Success(action.wallet, action.blockchain)) } store.dispatch(WalletAction.Warnings.CheckHashesCount.CheckHashesCountOnline) warningsMiddleware.tryToShowAppRatingWarning(action.wallet) @@ -402,7 +402,8 @@ class WalletMiddleware { } } } else { - if ((amounts?.size ?: 0) > 1) { + val amountsSize = amounts?.size ?: 0 + if (amountsSize > 1) { WalletAction.DialogAction.ChooseCurrency(amounts) } else { val amountToSend = amounts?.first() @@ -468,8 +469,8 @@ class WalletMiddleware { dispatchOnMain( WalletAction.SetWalletRent( wallet = walletManager.wallet, - minRent = ("${rentProvider.rentAmount().stripZeroPlainString()} $currency"), - rentExempt = ("${rentExempt.stripZeroPlainString()} $currency"), + minRent = "${rentProvider.rentAmount().stripZeroPlainString()} $currency", + rentExempt = "${rentExempt.stripZeroPlainString()} $currency", ), ) } else { diff --git a/app/src/main/java/com/tangem/tap/features/wallet/redux/middlewares/WarningsMiddleware.kt b/app/src/main/java/com/tangem/tap/features/wallet/redux/middlewares/WarningsMiddleware.kt index b2ef29f6b3..4f0307c06f 100644 --- a/app/src/main/java/com/tangem/tap/features/wallet/redux/middlewares/WarningsMiddleware.kt +++ b/app/src/main/java/com/tangem/tap/features/wallet/redux/middlewares/WarningsMiddleware.kt @@ -98,10 +98,8 @@ class WarningsMiddleware { } else if (!preferencesStorage.usedCardsPrefStorage.wasScanned(card.cardId)) { checkIfWarningNeeded(scanResponse)?.let { warning -> addWarningMessage(warning) } } - if (card.firmwareVersion.type == FirmwareVersion.FirmwareType.Release) { - if (!globalState.cardVerifiedOnline) { - addWarningMessage(WarningMessagesManager.onlineVerificationFailed()) - } + if (card.firmwareVersion.type == FirmwareVersion.FirmwareType.Release && !globalState.cardVerifiedOnline) { + addWarningMessage(WarningMessagesManager.onlineVerificationFailed()) } if (scanResponse.isDemoCard()) { addWarningMessage(WarningMessagesManager.demoCardWarning()) diff --git a/app/src/main/java/com/tangem/tap/features/wallet/redux/reducers/MultiWalletReducer.kt b/app/src/main/java/com/tangem/tap/features/wallet/redux/reducers/MultiWalletReducer.kt index afb523a5ca..93bae202ee 100644 --- a/app/src/main/java/com/tangem/tap/features/wallet/redux/reducers/MultiWalletReducer.kt +++ b/app/src/main/java/com/tangem/tap/features/wallet/redux/reducers/MultiWalletReducer.kt @@ -33,13 +33,14 @@ import com.tangem.wallet.R import java.math.BigDecimal class MultiWalletReducer { + @Suppress("LongMethod", "ComplexMethod") fun reduce(action: WalletAction.MultiWallet, state: WalletState): WalletState { return when (action) { is WalletAction.MultiWallet.AddBlockchains -> { val walletStores: List = action.blockchains.map { blockchain -> val walletManager = action.walletManagers.firstOrNull { it.wallet.blockchain == blockchain.blockchain && - (it.wallet.publicKey.derivationPath?.rawPath == blockchain.derivationPath) + it.wallet.publicKey.derivationPath?.rawPath == blockchain.derivationPath } val wallet = walletManager?.wallet val cardToken = if (!state.isMultiwalletAllowed) { diff --git a/app/src/main/java/com/tangem/tap/features/wallet/redux/reducers/OnWalletLoadedReducer.kt b/app/src/main/java/com/tangem/tap/features/wallet/redux/reducers/OnWalletLoadedReducer.kt index 68e6080883..dc01666309 100644 --- a/app/src/main/java/com/tangem/tap/features/wallet/redux/reducers/OnWalletLoadedReducer.kt +++ b/app/src/main/java/com/tangem/tap/features/wallet/redux/reducers/OnWalletLoadedReducer.kt @@ -34,10 +34,11 @@ class OnWalletLoadedReducer { } } + @Suppress("LongMethod") private fun onMultiWalletLoaded( wallet: Wallet, blockchainNetwork: BlockchainNetwork, - walletState: WalletState + walletState: WalletState, ): WalletState { val walletData = walletState.getWalletData(blockchainNetwork) ?: return walletState @@ -45,7 +46,7 @@ class OnWalletLoadedReducer { val coinAmountValue = wallet.amounts[AmountType.Coin]?.value val formattedAmount = coinAmountValue?.toFormattedCurrencyString( wallet.blockchain.decimals(), - wallet.blockchain.currency + wallet.blockchain.currency, ) val pendingTransactions = wallet.getPendingTransactions() @@ -98,7 +99,7 @@ class OnWalletLoadedReducer { amount = tokenAmountValue, amountFormatted = tokenAmountValue?.toFormattedCurrencyString( token.decimals, - token.symbol + token.symbol, ), fiatAmount = tokenFiatAmount, fiatAmountFormatted = tokenFiatAmountFormatted, @@ -141,7 +142,7 @@ class OnWalletLoadedReducer { val amount = wallet.amounts[AmountType.Coin]?.value val formattedAmount = amount?.toFormattedCurrencyString( wallet.blockchain.decimals(), - wallet.blockchain.currency + wallet.blockchain.currency, ) val fiatAmount = walletState.primaryWallet?.fiatRate?.let { amount?.toFiatValue(it) } val fiatAmountFormatted = fiatAmount?.toFormattedFiatValue(fiatCurrencyName) ?: UNKNOWN_AMOUNT_SIGN @@ -162,7 +163,7 @@ class OnWalletLoadedReducer { amount = amount, amountFormatted = formattedAmount, fiatAmount = fiatAmount, - fiatAmountFormatted = fiatAmountFormatted + fiatAmountFormatted = fiatAmountFormatted, ), pendingTransactions = pendingTransactions.removeUnknownTransactions(), mainButton = WalletMainButton.SendButton(sendButtonEnabled), @@ -171,7 +172,7 @@ class OnWalletLoadedReducer { val updatedStore = walletState.getWalletStore(walletData?.currency)?.updateWallets(wallets) return walletState.updateWalletStore(updatedStore).copy( - state = ProgressState.Done, error = null + state = ProgressState.Done, error = null, ) } } \ No newline at end of file diff --git a/app/src/main/java/com/tangem/tap/features/wallet/redux/reducers/TotalBalanceOperations.kt b/app/src/main/java/com/tangem/tap/features/wallet/redux/reducers/TotalBalanceOperations.kt index 08a7def4bd..1e15f2460a 100644 --- a/app/src/main/java/com/tangem/tap/features/wallet/redux/reducers/TotalBalanceOperations.kt +++ b/app/src/main/java/com/tangem/tap/features/wallet/redux/reducers/TotalBalanceOperations.kt @@ -25,22 +25,25 @@ fun List.calculateTotalCryptoAmount(): BigDecimal { private fun List.mapToProgressState(): List { return this.map { wallet -> - if (wallet.fiatRate == null) ProgressState.Error - else when (wallet.currencyData.status) { - BalanceStatus.Refreshing -> ProgressState.Refreshing - BalanceStatus.VerifiedOnline, - BalanceStatus.SameCurrencyTransactionInProgress, - BalanceStatus.TransactionInProgress, - BalanceStatus.NoAccount, - -> ProgressState.Done - BalanceStatus.Unreachable, - BalanceStatus.EmptyCard, - BalanceStatus.UnknownBlockchain, - BalanceStatus.MissedDerivation, - -> ProgressState.Error - BalanceStatus.Loading, - null, - -> ProgressState.Loading + if (wallet.fiatRate == null) { + ProgressState.Error + } else { + when (wallet.currencyData.status) { + BalanceStatus.Refreshing -> ProgressState.Refreshing + BalanceStatus.VerifiedOnline, + BalanceStatus.SameCurrencyTransactionInProgress, + BalanceStatus.TransactionInProgress, + BalanceStatus.NoAccount, + -> ProgressState.Done + BalanceStatus.Unreachable, + BalanceStatus.EmptyCard, + BalanceStatus.UnknownBlockchain, + BalanceStatus.MissedDerivation, + -> ProgressState.Error + BalanceStatus.Loading, + null, + -> ProgressState.Loading + } } } } diff --git a/app/src/main/java/com/tangem/tap/features/wallet/redux/reducers/WalletReducer.kt b/app/src/main/java/com/tangem/tap/features/wallet/redux/reducers/WalletReducer.kt index 2505702c20..3b6e95d27c 100644 --- a/app/src/main/java/com/tangem/tap/features/wallet/redux/reducers/WalletReducer.kt +++ b/app/src/main/java/com/tangem/tap/features/wallet/redux/reducers/WalletReducer.kt @@ -39,13 +39,12 @@ import org.rekotlin.Action import timber.log.Timber import java.math.BigDecimal -class WalletReducer { - companion object { - fun reduce(action: Action, state: AppState, appStateHolder: AppStateHolder): WalletState = - internalReduce(action, state, appStateHolder) - } +object WalletReducer { + fun reduce(action: Action, state: AppState, appStateHolder: AppStateHolder): WalletState = + internalReduce(action, state, appStateHolder) } +@Suppress("LongMethod", "ComplexMethod") private fun internalReduce(action: Action, state: AppState, appStateHolder: AppStateHolder): WalletState { val multiWalletReducer = MultiWalletReducer() diff --git a/app/src/main/java/com/tangem/tap/features/wallet/ui/BalanceWidget.kt b/app/src/main/java/com/tangem/tap/features/wallet/ui/BalanceWidget.kt index 025e3cc9ee..f4f1874710 100644 --- a/app/src/main/java/com/tangem/tap/features/wallet/ui/BalanceWidget.kt +++ b/app/src/main/java/com/tangem/tap/features/wallet/ui/BalanceWidget.kt @@ -31,7 +31,7 @@ data class BalanceWidgetData( val fiatAmountFormatted: String? = null, val token: TokenData? = null, val amountToCreateAccount: String? = null, - val errorMessage: String? = null + val errorMessage: String? = null, ) data class TokenData( @@ -44,7 +44,6 @@ data class TokenData( val fiatRate: BigDecimal? = null, ) - class BalanceWidget( private val binding: CardBalanceBinding, private val fragment: WalletFragment, @@ -52,6 +51,7 @@ class BalanceWidget( private val isTwinCard: Boolean, ) { + @Suppress("LongMethod", "ComplexMethod") fun setup() { when (data.status) { @@ -130,7 +130,7 @@ class BalanceWidget( tvErrorDescriptions.text = fragment.getString( R.string.no_account_generic, - data.amountToCreateAccount, data.currencySymbol + data.amountToCreateAccount, data.currencySymbol, ) } BalanceStatus.UnknownBlockchain -> with(binding.lBalanceError) { diff --git a/app/src/main/java/com/tangem/tap/features/wallet/ui/MultipleAddressUiHelper.kt b/app/src/main/java/com/tangem/tap/features/wallet/ui/MultipleAddressUiHelper.kt index ecbad2650a..67e10ca9a6 100644 --- a/app/src/main/java/com/tangem/tap/features/wallet/ui/MultipleAddressUiHelper.kt +++ b/app/src/main/java/com/tangem/tap/features/wallet/ui/MultipleAddressUiHelper.kt @@ -7,36 +7,34 @@ import com.tangem.blockchain.common.Blockchain import com.tangem.blockchain.common.address.AddressType import com.tangem.wallet.R -class MultipleAddressUiHelper { - companion object { - fun typeToId(type: AddressType): Int { - return when (type) { - is BitcoinAddressType.Legacy -> R.id.chip_legacy - is BitcoinAddressType.Segwit -> R.id.chip_default - is CardanoAddressType.Byron -> R.id.chip_legacy - is CardanoAddressType.Shelley -> R.id.chip_default - else -> View.NO_ID - } +object MultipleAddressUiHelper { + fun typeToId(type: AddressType): Int { + return when (type) { + is BitcoinAddressType.Legacy -> R.id.chip_legacy + is BitcoinAddressType.Segwit -> R.id.chip_default + is CardanoAddressType.Byron -> R.id.chip_legacy + is CardanoAddressType.Shelley -> R.id.chip_default + else -> View.NO_ID } + } - fun idToType(id: Int, blockchain: Blockchain?): AddressType? { - return when (id) { - R.id.chip_default -> { - when (blockchain) { - Blockchain.Bitcoin, Blockchain.BitcoinTestnet, Blockchain.Litecoin -> BitcoinAddressType.Segwit - Blockchain.CardanoShelley -> CardanoAddressType.Shelley - else -> null - } + fun idToType(id: Int, blockchain: Blockchain?): AddressType? { + return when (id) { + R.id.chip_default -> { + when (blockchain) { + Blockchain.Bitcoin, Blockchain.BitcoinTestnet, Blockchain.Litecoin -> BitcoinAddressType.Segwit + Blockchain.CardanoShelley -> CardanoAddressType.Shelley + else -> null } - R.id.chip_legacy -> { - when (blockchain) { - Blockchain.Bitcoin, Blockchain.BitcoinTestnet, Blockchain.Litecoin -> BitcoinAddressType.Legacy - Blockchain.CardanoShelley -> CardanoAddressType.Byron - else -> null - } - } - else -> null } + R.id.chip_legacy -> { + when (blockchain) { + Blockchain.Bitcoin, Blockchain.BitcoinTestnet, Blockchain.Litecoin -> BitcoinAddressType.Legacy + Blockchain.CardanoShelley -> CardanoAddressType.Byron + else -> null + } + } + else -> null } } } \ No newline at end of file diff --git a/app/src/main/java/com/tangem/tap/features/wallet/ui/WalletDetailsFragment.kt b/app/src/main/java/com/tangem/tap/features/wallet/ui/WalletDetailsFragment.kt index 630d934f4b..a35ba51df9 100644 --- a/app/src/main/java/com/tangem/tap/features/wallet/ui/WalletDetailsFragment.kt +++ b/app/src/main/java/com/tangem/tap/features/wallet/ui/WalletDetailsFragment.kt @@ -59,6 +59,7 @@ import kotlinx.coroutines.launch import kotlinx.coroutines.withContext import org.rekotlin.StoreSubscriber +@Suppress("LargeClass", "MagicNumber") class WalletDetailsFragment : Fragment(R.layout.fragment_wallet_details), StoreSubscriber { @@ -256,8 +257,6 @@ class WalletDetailsFragment : Fragment(R.layout.fragment_wallet_details), rowButtons.updateButtonsVisibility( exchangeServiceFeatureOn = isExchangeServiceFeatureOn, - buyAllowed = selectedWallet.isAvailableToBuy, - sellAllowed = selectedWallet.isAvailableToSell, sendAllowed = selectedWallet.mainButton.enabled, ) rowButtons.onTradeClick = { diff --git a/app/src/main/java/com/tangem/tap/features/wallet/ui/WalletFragment.kt b/app/src/main/java/com/tangem/tap/features/wallet/ui/WalletFragment.kt index 7c622df177..3873d90c69 100644 --- a/app/src/main/java/com/tangem/tap/features/wallet/ui/WalletFragment.kt +++ b/app/src/main/java/com/tangem/tap/features/wallet/ui/WalletFragment.kt @@ -17,11 +17,11 @@ import androidx.transition.TransitionInflater import by.kirich1409.viewbindingdelegate.viewBinding import coil.load import coil.size.Scale +import com.tangem.core.analytics.Analytics import com.tangem.core.ui.fragments.setStatusBarColor import com.tangem.core.ui.utils.OneTouchClickListener import com.tangem.domain.common.TapWorkarounds.isSaltPay import com.tangem.tap.MainActivity -import com.tangem.core.analytics.Analytics import com.tangem.tap.common.analytics.converters.BasicSignInEventConverter import com.tangem.tap.common.analytics.converters.BasicTopUpEventConverter import com.tangem.tap.common.analytics.events.MainScreen @@ -135,6 +135,7 @@ class WalletFragment : Fragment(R.layout.fragment_wallet), StoreSubscriber { + isSaltPay && walletView !is SaltPaySingleWalletView -> { walletView = SaltPaySingleWalletView() walletView.changeWalletView(this, binding) } diff --git a/app/src/main/java/com/tangem/tap/features/wallet/ui/adapters/WarningMessagesAdapter.kt b/app/src/main/java/com/tangem/tap/features/wallet/ui/adapters/WarningMessagesAdapter.kt index 774bfc2aee..1aca923c9d 100644 --- a/app/src/main/java/com/tangem/tap/features/wallet/ui/adapters/WarningMessagesAdapter.kt +++ b/app/src/main/java/com/tangem/tap/features/wallet/ui/adapters/WarningMessagesAdapter.kt @@ -75,6 +75,7 @@ class WarningMessageVH(val binding: LayoutWarningCardActionBinding) : RecyclerVi binding.warningCardAction.setCardBackgroundColor(binding.root.getColor(color)) } + @Suppress("LongMethod") private fun setupControlButtons(warning: WarningMessage) = when (warning.type) { WarningMessage.Type.Permanent, WarningMessage.Type.TestCard -> { binding.groupControlsTemporary.hide() diff --git a/app/src/main/java/com/tangem/tap/features/wallet/ui/dialogs/ScanFailsDialog.kt b/app/src/main/java/com/tangem/tap/features/wallet/ui/dialogs/ScanFailsDialog.kt index 3251bce185..f1081006c2 100644 --- a/app/src/main/java/com/tangem/tap/features/wallet/ui/dialogs/ScanFailsDialog.kt +++ b/app/src/main/java/com/tangem/tap/features/wallet/ui/dialogs/ScanFailsDialog.kt @@ -13,21 +13,17 @@ import com.tangem.wallet.R /** [REDACTED_AUTHOR] */ -class ScanFailsDialog { - - companion object { - fun create(context: Context): AlertDialog { - return AlertDialog.Builder(context).apply { - setTitle(context.getString(R.string.common_warning)) - setMessage(R.string.alert_troubleshooting_scan_card_title) - setPositiveButton(R.string.alert_button_request_support) { _, _ -> - Analytics.send(IntroductionProcess.ButtonRequestSupport()) - store.dispatch(GlobalAction.SendEmail(ScanFailsEmail())) - } - setNeutralButton(R.string.common_cancel) { _, _ -> } - setOnDismissListener { store.dispatchDialogHide() } - }.create() - } +object ScanFailsDialog { + fun create(context: Context): AlertDialog { + return AlertDialog.Builder(context).apply { + setTitle(context.getString(R.string.common_warning)) + setMessage(R.string.alert_troubleshooting_scan_card_title) + setPositiveButton(R.string.alert_button_request_support) { _, _ -> + Analytics.send(IntroductionProcess.ButtonRequestSupport()) + store.dispatch(GlobalAction.SendEmail(ScanFailsEmail())) + } + setNeutralButton(R.string.common_cancel) { _, _ -> } + setOnDismissListener { store.dispatchDialogHide() } + }.create() } - } \ No newline at end of file diff --git a/app/src/main/java/com/tangem/tap/features/wallet/ui/dialogs/SignedHashesWarningDialog.kt b/app/src/main/java/com/tangem/tap/features/wallet/ui/dialogs/SignedHashesWarningDialog.kt index c8db3c3d23..b419a42b81 100644 --- a/app/src/main/java/com/tangem/tap/features/wallet/ui/dialogs/SignedHashesWarningDialog.kt +++ b/app/src/main/java/com/tangem/tap/features/wallet/ui/dialogs/SignedHashesWarningDialog.kt @@ -8,26 +8,23 @@ import com.tangem.tap.features.wallet.redux.WalletAction import com.tangem.tap.store import com.tangem.wallet.R -class SignedHashesWarningDialog { - companion object { - fun create(context: Context): AlertDialog { - return AlertDialog.Builder(context).apply { - setTitle(context.getString(R.string.warning_important_security_info)) - setMessage(R.string.alert_signed_hashes_message) - setPositiveButton(R.string.common_understand) { _, _ -> - store.dispatch(WalletAction.Warnings.CheckHashesCount.SaveCardId) - store.dispatch( - GlobalAction.HideWarningMessage( - WarningMessagesManager.signedHashesMultiWalletWarning() - ) - ) - } - setNegativeButton(R.string.common_cancel) { _, _ -> } - setOnDismissListener { - store.dispatch(WalletAction.DialogAction.Hide) - } - }.create() - } +object SignedHashesWarningDialog { + fun create(context: Context): AlertDialog { + return AlertDialog.Builder(context).apply { + setTitle(context.getString(R.string.warning_important_security_info)) + setMessage(R.string.alert_signed_hashes_message) + setPositiveButton(R.string.common_understand) { _, _ -> + store.dispatch(WalletAction.Warnings.CheckHashesCount.SaveCardId) + store.dispatch( + GlobalAction.HideWarningMessage( + WarningMessagesManager.signedHashesMultiWalletWarning(), + ), + ) + } + setNegativeButton(R.string.common_cancel) { _, _ -> } + setOnDismissListener { + store.dispatch(WalletAction.DialogAction.Hide) + } + }.create() } - } \ No newline at end of file diff --git a/app/src/main/java/com/tangem/tap/features/wallet/ui/dialogs/SimpleOkDialog.kt b/app/src/main/java/com/tangem/tap/features/wallet/ui/dialogs/SimpleOkDialog.kt index d52c26763e..dc44583536 100644 --- a/app/src/main/java/com/tangem/tap/features/wallet/ui/dialogs/SimpleOkDialog.kt +++ b/app/src/main/java/com/tangem/tap/features/wallet/ui/dialogs/SimpleOkDialog.kt @@ -10,49 +10,47 @@ import com.tangem.wallet.R /** [REDACTED_AUTHOR] */ -class SimpleOkDialog { +object SimpleOkDialog { - companion object { - fun create(dialog: AppDialog.SimpleOkDialog, context: Context): AlertDialog { - return AlertDialog.Builder(context).apply { - setTitle(dialog.header) - setMessage(dialog.message) - setPositiveButton(R.string.common_ok) { _, _ -> } - setOnDismissListener { - store.dispatchDialogHide() - dialog.onOk?.invoke() - } - }.create() - } - - fun create(dialog: AppDialog.SimpleOkDialogRes, context: Context): AlertDialog { - return AlertDialog.Builder(context).apply { - setTitle(context.getString(dialog.headerId)) - setMessage(dialog.messageId) - setPositiveButton(R.string.common_ok) { _, _ -> } - setOnDismissListener { - store.dispatchDialogHide() - dialog.onOk?.invoke() - } - }.create() - } - - fun create(dialog: AppDialog.SimpleOkErrorDialog, context: Context): AlertDialog = create( - dialog = AppDialog.SimpleOkDialog( - header = context.getString(R.string.common_error), - message = dialog.message, - onOk = dialog.onOk, - ), - context = context, - ) - - fun create(dialog: AppDialog.SimpleOkWarningDialog, context: Context): AlertDialog = create( - dialog = AppDialog.SimpleOkDialog( - header = context.getString(R.string.common_warning), - message = dialog.message, - onOk = dialog.onOk, - ), - context = context, - ) + fun create(dialog: AppDialog.SimpleOkDialog, context: Context): AlertDialog { + return AlertDialog.Builder(context).apply { + setTitle(dialog.header) + setMessage(dialog.message) + setPositiveButton(R.string.common_ok) { _, _ -> } + setOnDismissListener { + store.dispatchDialogHide() + dialog.onOk?.invoke() + } + }.create() } + + fun create(dialog: AppDialog.SimpleOkDialogRes, context: Context): AlertDialog { + return AlertDialog.Builder(context).apply { + setTitle(context.getString(dialog.headerId)) + setMessage(dialog.messageId) + setPositiveButton(R.string.common_ok) { _, _ -> } + setOnDismissListener { + store.dispatchDialogHide() + dialog.onOk?.invoke() + } + }.create() + } + + fun create(dialog: AppDialog.SimpleOkErrorDialog, context: Context): AlertDialog = create( + dialog = AppDialog.SimpleOkDialog( + header = context.getString(R.string.common_error), + message = dialog.message, + onOk = dialog.onOk, + ), + context = context, + ) + + fun create(dialog: AppDialog.SimpleOkWarningDialog, context: Context): AlertDialog = create( + dialog = AppDialog.SimpleOkDialog( + header = context.getString(R.string.common_warning), + message = dialog.message, + onOk = dialog.onOk, + ), + context = context, + ) } \ No newline at end of file diff --git a/app/src/main/java/com/tangem/tap/features/wallet/ui/images/CurrencyIconView.kt b/app/src/main/java/com/tangem/tap/features/wallet/ui/images/CurrencyIconView.kt index b6d34873df..d05ac08cc9 100644 --- a/app/src/main/java/com/tangem/tap/features/wallet/ui/images/CurrencyIconView.kt +++ b/app/src/main/java/com/tangem/tap/features/wallet/ui/images/CurrencyIconView.kt @@ -13,6 +13,7 @@ import com.tangem.tap.features.wallet.models.Currency import com.tangem.wallet.databinding.ViewCurrencyIconBinding import kotlin.math.roundToInt +@Suppress("MagicNumber") class CurrencyIconView @JvmOverloads constructor( context: Context, attrs: AttributeSet? = null, diff --git a/app/src/main/java/com/tangem/tap/features/wallet/ui/images/RoundedCornersCropTransformation.kt b/app/src/main/java/com/tangem/tap/features/wallet/ui/images/RoundedCornersCropTransformation.kt deleted file mode 100644 index 7a9b0a3015..0000000000 --- a/app/src/main/java/com/tangem/tap/features/wallet/ui/images/RoundedCornersCropTransformation.kt +++ /dev/null @@ -1,58 +0,0 @@ -package com.tangem.tap.features.wallet.ui.images - -import android.graphics.Bitmap -import android.graphics.BitmapShader -import android.graphics.Matrix -import android.graphics.Paint -import android.graphics.RectF -import android.graphics.Shader -import androidx.annotation.Px -import androidx.core.graphics.applyCanvas -import coil.size.Size -import coil.size.pxOrElse -import coil.transform.Transformation - -class RoundedCornersCropTransformation( - @Px val radiusPx: Float, -) : Transformation { - override val cacheKey: String = "${javaClass.name}-$radiusPx" - - override suspend fun transform(input: Bitmap, size: Size): Bitmap { - val outputWidth = size.width.pxOrElse { Int.MAX_VALUE } - val outputHeight = size.height.pxOrElse { Int.MAX_VALUE } - val outputSize = minOf(outputWidth, outputHeight) - val output = Bitmap.createBitmap(outputSize, outputSize, Bitmap.Config.ARGB_8888) - - val rect = RectF( - /* left = */ 0f, - /* top = */ 0f, - /* right = */ outputWidth.toFloat(), - /* bottom = */ outputHeight.toFloat() - ) - val matrix = Matrix().apply { - setTranslate( - /* dx = */ (outputWidth - input.width) * .5f, - /* dy = */ (outputHeight - input.height) * .5f - ) - } - val bitmapShader = BitmapShader( - /* bitmap = */ input, - /* tileX = */ Shader.TileMode.DECAL, - /* tileY = */ Shader.TileMode.DECAL - ).apply { - setLocalMatrix(matrix) - } - val paint = Paint(Paint.ANTI_ALIAS_FLAG or Paint.FILTER_BITMAP_FLAG).apply { - shader = bitmapShader - } - - return output.applyCanvas { - drawRoundRect( - /* rect = */ rect, - /* rx = */ radiusPx, - /* ry = */ radiusPx, - /* paint = */ paint - ) - } - } -} \ No newline at end of file diff --git a/app/src/main/java/com/tangem/tap/features/wallet/ui/test/TestWallet.kt b/app/src/main/java/com/tangem/tap/features/wallet/ui/test/TestWallet.kt new file mode 100644 index 0000000000..5b3dab3e8b --- /dev/null +++ b/app/src/main/java/com/tangem/tap/features/wallet/ui/test/TestWallet.kt @@ -0,0 +1,160 @@ +package com.tangem.tap.features.wallet.ui.test + +import com.tangem.blockchain.common.Amount +import com.tangem.blockchain.common.AmountType +import com.tangem.blockchain.common.Token +import com.tangem.blockchain.common.WalletManager +import com.tangem.common.extensions.guard +import com.tangem.tap.common.TestAction +import com.tangem.tap.common.TestActions +import com.tangem.tap.common.extensions.dispatchDebugErrorNotification +import com.tangem.tap.domain.tokens.models.BlockchainNetwork +import com.tangem.tap.features.wallet.redux.WalletAction +import com.tangem.tap.store +import java.math.BigDecimal +import kotlin.random.Random + +/** +[REDACTED_AUTHOR] + */ +object TestWallet { + fun solanaRentExemptWarning(): List { + val checker = SolanaRentWarningActionEmitter() + return listOf( + "BALANCE = 0.0" to { checker.setZeroBalance() }, + "BALANCE < 0.00089088" to { checker.setLessThanRentExempt() }, + "BALANCE > 0.00089088" to { checker.setMoreThanRentExempt() }, + "BALANCE = 0.00089087" to { checker.setLessThanRentExemptByOne() }, + "BALANCE = 0.00089088 (rent exempt)" to { checker.setForRentExemptBarrier() }, + "BALANCE = 0.00089089" to { checker.setMoreThanRentExemptByOne() }, + ) + } + + fun getBlockchainBalanceActions(blockchainNetwork: BlockchainNetwork): List { + return getBlockchainBalanceActions( + getWalletManager(blockchainNetwork), + blockchainNetwork.blockchain.decimals(), + ) + } + + fun getTokenBalanceAction(blockchainNetwork: BlockchainNetwork, token: Token): List { + return getTokenBalanceAction(getWalletManager(blockchainNetwork), token) + } + + fun getBlockchainBalanceActions(walletManager: WalletManager?, decimals: Int): List { + val minValue = BigDecimal.ONE.movePointLeft(decimals) + val averageValue = BigDecimal.ONE.movePointRight(decimals) + .divide(BigDecimal(2)).movePointLeft(decimals) + val maxValue = BigDecimal(2).pow(32) + + return listOf( + "0.0" to { setBalance(walletManager, BigDecimal.ZERO) }, + "Min value" to { setBalance(walletManager, minValue) }, + "Average value" to { setBalance(walletManager, averageValue) }, + "Max value" to { setBalance(walletManager, maxValue) }, + "1234567890123.01234567890123" to { setBalance(walletManager, BigDecimal.ZERO) }, + ) + } + + fun getTokenBalanceAction(walletManager: WalletManager?, token: Token): List { + val minValue = BigDecimal.ONE.movePointLeft(token.decimals) + val averageValue = BigDecimal.ONE.movePointRight(token.decimals) + .divide(BigDecimal(2)).movePointLeft(token.decimals) + val maxValue = BigDecimal(2).pow(32) + + return listOf( + "0.0" to { setTokenBalance(walletManager, BigDecimal.ZERO, token) }, + "Min value" to { setTokenBalance(walletManager, minValue, token) }, + "Average value" to { setTokenBalance(walletManager, averageValue, token) }, + "Max value" to { setTokenBalance(walletManager, maxValue, token) }, + "1234567890123.01234567890123" to { setTokenBalance(walletManager, BigDecimal.ZERO, token) }, + ) + } + + fun setBalance(walletManager: WalletManager?, value: BigDecimal) { + val manager = walletManager.guard { + store.dispatchDebugErrorNotification("WalletManager not found") + return + } + val amount = manager.wallet.amounts[AmountType.Coin] ?: Amount(manager.wallet.blockchain) + setBalance(manager, amount, value) + } + + private fun setTokenBalance(walletManager: WalletManager?, value: BigDecimal, token: Token? = null) { + val manager = walletManager.guard { + store.dispatchDebugErrorNotification("WalletManager not found") + return + } + val token = token.guard { + store.dispatchDebugErrorNotification("Token not found") + return + } + + val amount = manager.wallet.amounts[AmountType.Token(token)] ?: Amount(token) + setBalance(manager, amount, value) + } + + private fun setBalance(walletManager: WalletManager, amount: Amount, value: BigDecimal) { + TestActions.testAmountInjectionForWalletManagerEnabled = true + walletManager.wallet.setAmount(amount.copy(value = value)) + store.dispatch(WalletAction.LoadData) + } + + private fun getWalletManager(blockchainNetwork: BlockchainNetwork): WalletManager? { + return store.state.walletState.getWalletManager(blockchainNetwork) + } +} + +private class SolanaRentWarningActionEmitter { + + private val zero = BigDecimal.ZERO + private val one = BigDecimal(0.00000001) + private val rentExemptBarrier = BigDecimal(0.00089088) + private val lessThanRentExemptByOne = rentExemptBarrier.minus(one) + private val moreThanRentExemptByOne = rentExemptBarrier.plus(one) + private val moreThanRentExempt = rentExemptBarrier.plus(Random.nextDouble().toBigDecimal()) + private val lessThanRentExempt = rentExemptBarrier + .minus(Random.nextDouble(0.0, rentExemptBarrier.minus(one).toDouble()).toBigDecimal()) + + fun setZeroBalance() { + setBalance(zero) + } + + fun setForRentExemptBarrier() { + setBalance(rentExemptBarrier) + } + + fun setLessThanRentExemptByOne() { + setBalance(lessThanRentExemptByOne) + } + + fun setMoreThanRentExemptByOne() { + setBalance(moreThanRentExemptByOne) + } + + fun setMoreThanRentExempt() { + setBalance(moreThanRentExempt) + } + + fun setLessThanRentExempt() { + setBalance(lessThanRentExempt) + } + + private fun setBalance(value: BigDecimal) { + val amount = Amount(getBlockchainNetwork().blockchain).copy(value = value) + getWalletManager().apply { + TestActions.testAmountInjectionForWalletManagerEnabled = true + wallet.setAmount(amount) + } + store.dispatch(WalletAction.LoadData) + } + + private fun getWalletManager(): WalletManager { + return store.state.walletState.getWalletManager(getBlockchainNetwork())!! + } + + private fun getBlockchainNetwork(): BlockchainNetwork { + val currency = store.state.walletState.selectedWalletData!!.currency + return BlockchainNetwork(currency.blockchain, currency.derivationPath, listOf()) + } +} \ No newline at end of file diff --git a/app/src/main/java/com/tangem/tap/features/wallet/ui/test/TestWalletDetailsActions.kt b/app/src/main/java/com/tangem/tap/features/wallet/ui/test/TestWalletDetailsActions.kt deleted file mode 100644 index 857cdd2631..0000000000 --- a/app/src/main/java/com/tangem/tap/features/wallet/ui/test/TestWalletDetailsActions.kt +++ /dev/null @@ -1,162 +0,0 @@ -package com.tangem.tap.features.wallet.ui.test - -import com.tangem.blockchain.common.Amount -import com.tangem.blockchain.common.AmountType -import com.tangem.blockchain.common.Token -import com.tangem.blockchain.common.WalletManager -import com.tangem.common.extensions.guard -import com.tangem.tap.common.TestAction -import com.tangem.tap.common.TestActions -import com.tangem.tap.common.extensions.dispatchDebugErrorNotification -import com.tangem.tap.domain.tokens.models.BlockchainNetwork -import com.tangem.tap.features.wallet.redux.WalletAction -import com.tangem.tap.store -import java.math.BigDecimal -import kotlin.random.Random - -/** -[REDACTED_AUTHOR] - */ -class TestWallet { - companion object { - fun solanaRentExemptWarning(): List { - val checker = SolanaRentWarningActionEmitter() - return listOf( - "BALANCE = 0.0" to { checker.setZeroBalance() }, - "BALANCE < 0.00089088" to { checker.setLessThanRentExempt() }, - "BALANCE > 0.00089088" to { checker.setMoreThanRentExempt() }, - "BALANCE = 0.00089087" to { checker.setLessThanRentExemptByOne() }, - "BALANCE = 0.00089088 (rent exempt)" to { checker.setForRentExemptBarrier() }, - "BALANCE = 0.00089089" to { checker.setMoreThanRentExemptByOne() }, - ) - } - - fun getBlockchainBalanceActions(blockchainNetwork: BlockchainNetwork): List { - return getBlockchainBalanceActions( - getWalletManager(blockchainNetwork), - blockchainNetwork.blockchain.decimals(), - ) - } - - fun getTokenBalanceAction(blockchainNetwork: BlockchainNetwork, token: Token): List { - return getTokenBalanceAction(getWalletManager(blockchainNetwork), token) - } - - fun getBlockchainBalanceActions(walletManager: WalletManager?, decimals: Int): List { - val minValue = BigDecimal.ONE.movePointLeft(decimals) - val averageValue = BigDecimal.ONE.movePointRight(decimals) - .divide(BigDecimal(2)).movePointLeft(decimals) - val maxValue = BigDecimal(2).pow(32) - - return listOf( - "0.0" to { setBalance(walletManager, BigDecimal.ZERO) }, - "Min value" to { setBalance(walletManager, minValue) }, - "Average value" to { setBalance(walletManager, averageValue) }, - "Max value" to { setBalance(walletManager, maxValue) }, - "1234567890123.01234567890123" to { setBalance(walletManager, BigDecimal.ZERO) }, - ) - } - - fun getTokenBalanceAction(walletManager: WalletManager?, token: Token): List { - val minValue = BigDecimal.ONE.movePointLeft(token.decimals) - val averageValue = BigDecimal.ONE.movePointRight(token.decimals) - .divide(BigDecimal(2)).movePointLeft(token.decimals) - val maxValue = BigDecimal(2).pow(32) - - return listOf( - "0.0" to { setTokenBalance(walletManager, BigDecimal.ZERO, token) }, - "Min value" to { setTokenBalance(walletManager, minValue, token) }, - "Average value" to { setTokenBalance(walletManager, averageValue, token) }, - "Max value" to { setTokenBalance(walletManager, maxValue, token) }, - "1234567890123.01234567890123" to { setTokenBalance(walletManager, BigDecimal.ZERO, token) }, - ) - } - - fun setBalance(walletManager: WalletManager?, value: BigDecimal) { - val manager = walletManager.guard { - store.dispatchDebugErrorNotification("WalletManager not found") - return - } - val amount = manager.wallet.amounts[AmountType.Coin] ?: Amount(manager.wallet.blockchain) - setBalance(manager, amount, value) - } - - private fun setTokenBalance(walletManager: WalletManager?, value: BigDecimal, token: Token? = null) { - val manager = walletManager.guard { - store.dispatchDebugErrorNotification("WalletManager not found") - return - } - val token = token.guard { - store.dispatchDebugErrorNotification("Token not found") - return - } - - val amount = manager.wallet.amounts[AmountType.Token(token)] ?: Amount(token) - setBalance(manager, amount, value) - } - - private fun setBalance(walletManager: WalletManager, amount: Amount, value: BigDecimal) { - TestActions.testAmountInjectionForWalletManagerEnabled = true - walletManager.wallet.setAmount(amount.copy(value = value)) - store.dispatch(WalletAction.LoadData) - } - - private fun getWalletManager(blockchainNetwork: BlockchainNetwork): WalletManager? { - return store.state.walletState.getWalletManager(blockchainNetwork) - } - } -} - -private class SolanaRentWarningActionEmitter { - - private val zero = BigDecimal.ZERO - private val one = BigDecimal(0.00000001) - private val rentExemptBarrier = BigDecimal(0.00089088) - private val lessThanRentExemptByOne = rentExemptBarrier.minus(one) - private val moreThanRentExemptByOne = rentExemptBarrier.plus(one) - private val moreThanRentExempt = rentExemptBarrier.plus(Random.nextDouble().toBigDecimal()) - private val lessThanRentExempt = rentExemptBarrier - .minus(Random.nextDouble(0.0, rentExemptBarrier.minus(one).toDouble()).toBigDecimal()) - - fun setZeroBalance() { - setBalance(zero) - } - - fun setForRentExemptBarrier() { - setBalance(rentExemptBarrier) - } - - fun setLessThanRentExemptByOne() { - setBalance(lessThanRentExemptByOne) - } - - fun setMoreThanRentExemptByOne() { - setBalance(moreThanRentExemptByOne) - } - - fun setMoreThanRentExempt() { - setBalance(moreThanRentExempt) - } - - fun setLessThanRentExempt() { - setBalance(lessThanRentExempt) - } - - private fun setBalance(value: BigDecimal) { - val amount = Amount(getBlockchainNetwork().blockchain).copy(value = value) - getWalletManager().apply { - TestActions.testAmountInjectionForWalletManagerEnabled = true - wallet.setAmount(amount) - } - store.dispatch(WalletAction.LoadData) - } - - private fun getWalletManager(): WalletManager { - return store.state.walletState.getWalletManager(getBlockchainNetwork())!! - } - - private fun getBlockchainNetwork(): BlockchainNetwork { - val currency = store.state.walletState.selectedWalletData!!.currency - return BlockchainNetwork(currency.blockchain, currency.derivationPath, listOf()) - } -} \ No newline at end of file diff --git a/app/src/main/java/com/tangem/tap/features/wallet/ui/view/WalletDetailsButtonsRow.kt b/app/src/main/java/com/tangem/tap/features/wallet/ui/view/WalletDetailsButtonsRow.kt index 5c73fa7531..8c18434a94 100644 --- a/app/src/main/java/com/tangem/tap/features/wallet/ui/view/WalletDetailsButtonsRow.kt +++ b/app/src/main/java/com/tangem/tap/features/wallet/ui/view/WalletDetailsButtonsRow.kt @@ -33,12 +33,7 @@ internal class WalletDetailsButtonsRow @JvmOverloads constructor( } } - fun updateButtonsVisibility( - exchangeServiceFeatureOn: Boolean, - buyAllowed: Boolean, - sellAllowed: Boolean, - sendAllowed: Boolean, - ) = with(binding) { + fun updateButtonsVisibility(exchangeServiceFeatureOn: Boolean, sendAllowed: Boolean) = with(binding) { containerExchangeButtons.isVisible = exchangeServiceFeatureOn btnBuy.hide() btnSell.hide() diff --git a/app/src/main/java/com/tangem/tap/features/wallet/ui/wallet/SaltPayBalanceWidget.kt b/app/src/main/java/com/tangem/tap/features/wallet/ui/wallet/SaltPayBalanceWidget.kt index 49fcb89c16..3741a4c59d 100644 --- a/app/src/main/java/com/tangem/tap/features/wallet/ui/wallet/SaltPayBalanceWidget.kt +++ b/app/src/main/java/com/tangem/tap/features/wallet/ui/wallet/SaltPayBalanceWidget.kt @@ -24,7 +24,7 @@ class SaltPayBalanceWidget( private val binding: LayoutSingleWalletBalanceBinding, private val data: SaltPayBalanceWidgetData, ) { - fun setup(): Unit = with(binding) { + fun setup() = with(binding) { if (data.state == ProgressState.Loading) { veilBalance.veil() veilBalanceCrypto.veil() @@ -45,7 +45,7 @@ class SaltPayBalanceWidget( actionDebouncer(WalletAction.LoadFiatRate()) } else { veilBalance.unVeil() - tvBalance.text = data.fiatAmount?.formatAmountAsSpannedString( + tvBalance.text = data.fiatAmount.formatAmountAsSpannedString( currencySymbol = data.fiatCurrency?.symbol ?: "", ) } diff --git a/app/src/main/java/com/tangem/tap/features/wallet/ui/wallet/SingleWalletView.kt b/app/src/main/java/com/tangem/tap/features/wallet/ui/wallet/SingleWalletView.kt index 1e96cb230b..6b53c12857 100644 --- a/app/src/main/java/com/tangem/tap/features/wallet/ui/wallet/SingleWalletView.kt +++ b/app/src/main/java/com/tangem/tap/features/wallet/ui/wallet/SingleWalletView.kt @@ -130,8 +130,6 @@ class SingleWalletView : WalletView() { ) { rowButtons.updateButtonsVisibility( exchangeServiceFeatureOn = isExchangeServiceFeatureEnabled, - buyAllowed = walletData.isAvailableToBuy, - sellAllowed = walletData.isAvailableToSell, sendAllowed = walletData.mainButton.enabled, ) diff --git a/app/src/main/java/com/tangem/tap/features/walletSelector/redux/WalletSelectorMiddleware.kt b/app/src/main/java/com/tangem/tap/features/walletSelector/redux/WalletSelectorMiddleware.kt index 5b15d07266..98abb38ab3 100644 --- a/app/src/main/java/com/tangem/tap/features/walletSelector/redux/WalletSelectorMiddleware.kt +++ b/app/src/main/java/com/tangem/tap/features/walletSelector/redux/WalletSelectorMiddleware.kt @@ -99,21 +99,23 @@ internal class WalletSelectorMiddleware { updatedWalletStores: Map>, state: WalletSelectorState, ) { - if (updatedWalletStores.isNotEmpty()) scope.launch(Dispatchers.Default) { - state.wallets - .associateWith { updatedWalletStores[it.id] } - .forEach { (wallet, walletStores) -> - val isWalletTokensEmpty = (wallet.type as? UserWalletModel.Type.MultiCurrency)?.tokensCount == 0 - val updatedWallet = if (walletStores == null && isWalletTokensEmpty) { - wallet.copy(fiatBalance = TotalFiatBalance.Loaded(BigDecimal.ZERO)) - } else { - wallet.updateWalletStoresAndCalculateFiatBalance(walletStores.orEmpty()) - } + if (updatedWalletStores.isNotEmpty()) { + scope.launch(Dispatchers.Default) { + state.wallets + .associateWith { updatedWalletStores[it.id] } + .forEach { (wallet, walletStores) -> + val isWalletTokensEmpty = (wallet.type as? UserWalletModel.Type.MultiCurrency)?.tokensCount == 0 + val updatedWallet = if (walletStores == null && isWalletTokensEmpty) { + wallet.copy(fiatBalance = TotalFiatBalance.Loaded(BigDecimal.ZERO)) + } else { + wallet.updateWalletStoresAndCalculateFiatBalance(walletStores.orEmpty()) + } - if (wallet != updatedWallet) { - store.dispatchOnMain(WalletSelectorAction.BalanceLoaded(updatedWallet)) + if (wallet != updatedWallet) { + store.dispatchOnMain(WalletSelectorAction.BalanceLoaded(updatedWallet)) + } } - } + } } } diff --git a/app/src/main/java/com/tangem/tap/features/walletSelector/redux/WalletSelectorReducer.kt b/app/src/main/java/com/tangem/tap/features/walletSelector/redux/WalletSelectorReducer.kt index 9a8ba16eae..d0d0dffab7 100644 --- a/app/src/main/java/com/tangem/tap/features/walletSelector/redux/WalletSelectorReducer.kt +++ b/app/src/main/java/com/tangem/tap/features/walletSelector/redux/WalletSelectorReducer.kt @@ -13,6 +13,7 @@ internal object WalletSelectorReducer { } else state.walletSelectorState } + @Suppress("ComplexMethod") private fun internalReduce(action: WalletSelectorAction, state: WalletSelectorState): WalletSelectorState { return when (action) { is WalletSelectorAction.UserWalletsLoaded -> state.copy( diff --git a/app/src/main/java/com/tangem/tap/features/walletSelector/ui/components/WallectSelectorScreenContent.kt b/app/src/main/java/com/tangem/tap/features/walletSelector/ui/components/WallectSelectorScreenContent.kt index 23ea8c4c9e..ab21b44b36 100644 --- a/app/src/main/java/com/tangem/tap/features/walletSelector/ui/components/WallectSelectorScreenContent.kt +++ b/app/src/main/java/com/tangem/tap/features/walletSelector/ui/components/WallectSelectorScreenContent.kt @@ -37,6 +37,7 @@ import com.tangem.domain.common.util.UserWalletId import com.tangem.tap.features.walletSelector.ui.WalletSelectorScreenState import com.tangem.wallet.R +@Suppress("LongParameterList") @OptIn(ExperimentalFoundationApi::class) @Composable internal fun WalletSelectorScreenContent( diff --git a/app/src/main/java/com/tangem/tap/features/walletSelector/ui/components/WalletItem.kt b/app/src/main/java/com/tangem/tap/features/walletSelector/ui/components/WalletItem.kt index 3b6f021dba..c98912667b 100644 --- a/app/src/main/java/com/tangem/tap/features/walletSelector/ui/components/WalletItem.kt +++ b/app/src/main/java/com/tangem/tap/features/walletSelector/ui/components/WalletItem.kt @@ -327,7 +327,7 @@ private fun SelectedWalletBadge( contentAlignment = Alignment.Center, ) { Icon( - modifier = Modifier.padding(all = (0.5).dp), + modifier = Modifier.padding(all = 0.5.dp), painter = painterResource(id = R.drawable.ic_check_circle_18), tint = TangemTheme.colors.icon.accent, contentDescription = null, diff --git a/app/src/main/java/com/tangem/tap/features/welcome/ui/components/WelcomeScreenContent.kt b/app/src/main/java/com/tangem/tap/features/welcome/ui/components/WelcomeScreenContent.kt index 709c151963..de0ccac450 100644 --- a/app/src/main/java/com/tangem/tap/features/welcome/ui/components/WelcomeScreenContent.kt +++ b/app/src/main/java/com/tangem/tap/features/welcome/ui/components/WelcomeScreenContent.kt @@ -24,6 +24,7 @@ import com.tangem.core.ui.components.SpacerHMax import com.tangem.core.ui.res.TangemTheme import com.tangem.wallet.R +@Suppress("LongMethod") @Composable internal fun WelcomeScreenContent( modifier: Modifier = Modifier, diff --git a/app/src/main/java/com/tangem/tap/network/NetworkConnectivity.kt b/app/src/main/java/com/tangem/tap/network/NetworkConnectivity.kt index 00c2f87e19..71d0ed9206 100644 --- a/app/src/main/java/com/tangem/tap/network/NetworkConnectivity.kt +++ b/app/src/main/java/com/tangem/tap/network/NetworkConnectivity.kt @@ -15,8 +15,8 @@ import java.lang.ref.WeakReference [REDACTED_AUTHOR] */ class NetworkConnectivity( - private val store: Store<*>, - context: Context + private val store: Store<*>, + context: Context, ) { private val wContext: WeakReference = WeakReference(context) @@ -34,19 +34,16 @@ class NetworkConnectivity( store.dispatch(NetworkStateChanged(isOnlineOrConnecting())) } - fun isOnlineOrConnecting(): Boolean { val connectivityManager = getConnectivityManager() ?: return false - return if (Build.VERSION.SDK_INT >= 23) { - val capabilities = - connectivityManager.getNetworkCapabilities(connectivityManager.activeNetwork) - (capabilities != null) && - (capabilities.hasTransport(NetworkCapabilities.TRANSPORT_CELLULAR) || - capabilities.hasTransport(NetworkCapabilities.TRANSPORT_WIFI) || - capabilities.hasTransport(NetworkCapabilities.TRANSPORT_VPN) || - capabilities.hasTransport(NetworkCapabilities.TRANSPORT_ETHERNET)) - + return if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) { + val capabilities = connectivityManager.getNetworkCapabilities(connectivityManager.activeNetwork) + capabilities != null && + (capabilities.hasTransport(NetworkCapabilities.TRANSPORT_CELLULAR) || + capabilities.hasTransport(NetworkCapabilities.TRANSPORT_WIFI) || + capabilities.hasTransport(NetworkCapabilities.TRANSPORT_VPN) || + capabilities.hasTransport(NetworkCapabilities.TRANSPORT_ETHERNET)) } else { val networkInfo = connectivityManager.activeNetworkInfo networkInfo != null && networkInfo.isConnectedOrConnecting @@ -55,7 +52,7 @@ class NetworkConnectivity( private fun getConnectivityManager(): ConnectivityManager? { return wContext.get()?.applicationContext - ?.getSystemService(Context.CONNECTIVITY_SERVICE) as? ConnectivityManager + ?.getSystemService(Context.CONNECTIVITY_SERVICE) as? ConnectivityManager } companion object { diff --git a/app/src/main/java/com/tangem/tap/network/exchangeServices/CurrencyExchangeManager.kt b/app/src/main/java/com/tangem/tap/network/exchangeServices/CurrencyExchangeManager.kt index 3f61d82801..671c45af11 100644 --- a/app/src/main/java/com/tangem/tap/network/exchangeServices/CurrencyExchangeManager.kt +++ b/app/src/main/java/com/tangem/tap/network/exchangeServices/CurrencyExchangeManager.kt @@ -59,7 +59,7 @@ class CurrencyExchangeManager( blockchain, cryptoCurrencyName, fiatCurrencyName, - walletAddress + walletAddress, ) } @@ -86,7 +86,6 @@ class CurrencyExchangeManager( } } -@Suppress("unused") suspend fun CurrencyExchangeManager.buyErc20TestnetTokens( card: CardDTO, walletManager: EthereumWalletManager, @@ -97,13 +96,15 @@ suspend fun CurrencyExchangeManager.buyErc20TestnetTokens( val amountToSend = Amount(walletManager.wallet.blockchain) val destinationAddress = token.contractAddress - val feeResult = walletManager.getFee(amountToSend, - destinationAddress) as? Result.Success ?: return + val feeResult = + walletManager.getFee( + amountToSend, + destinationAddress, + ) as? Result.Success ?: return val fee = feeResult.data[0] - if ((walletManager.wallet.amounts[AmountType.Coin]?.value ?: BigDecimal.ZERO) < fee.value) { - return - } + val coinValue = walletManager.wallet.amounts[AmountType.Coin]?.value ?: BigDecimal.ZERO + if (coinValue < fee.value) return val transaction = walletManager.createTransaction(amountToSend, fee, destinationAddress) @@ -116,8 +117,8 @@ suspend fun CurrencyExchangeManager.buyErc20TestnetTokens( GlobalAction.UpdateWalletSignedHashes( walletSignedHashes = signResponse.totalSignedHashes, walletPublicKey = walletManager.wallet.publicKey.seedKey, - remainingSignatures = signResponse.remainingSignatures - ) + remainingSignatures = signResponse.remainingSignatures, + ), ) } walletManager.send(transaction, signer) diff --git a/app/src/main/java/com/tangem/tap/network/exchangeServices/mercuryo/MercuryoService.kt b/app/src/main/java/com/tangem/tap/network/exchangeServices/mercuryo/MercuryoService.kt index 9dd2b9746f..b326ccbb79 100644 --- a/app/src/main/java/com/tangem/tap/network/exchangeServices/mercuryo/MercuryoService.kt +++ b/app/src/main/java/com/tangem/tap/network/exchangeServices/mercuryo/MercuryoService.kt @@ -33,11 +33,12 @@ class MercuryoService( override fun featureIsSwitchedOn(): Boolean = true + @Suppress("NestedBlockDepth") override suspend fun update() { when (val result = performRequest { api.currencies(apiVersion) }) { is Result.Success -> { val response = result.data - if (response.status == 200) { + if (response.status == RESPONSE_SUCCESS_STATUS_CODE) { // all currencies which can be bought val currenciesAvailableToBy = response.data.crypto // tokens which can be bought only from specific blockchain network @@ -108,7 +109,7 @@ class MercuryoService( blockchain: Blockchain, cryptoCurrencyName: CryptoCurrencyName, fiatCurrencyName: String, - walletAddress: String + walletAddress: String, ): String { if (action == CurrencyExchangeManager.Action.Sell) throw UnsupportedOperationException() @@ -131,10 +132,9 @@ class MercuryoService( return (address + secret).calculateSha512().toHexString().lowercase() } - override fun getSellCryptoReceiptUrl( action: CurrencyExchangeManager.Action, - transactionId: String + transactionId: String, ): String? = null private fun blockchainFromCurrencyName(currencyName: String): Blockchain? = when (currencyName) { @@ -143,4 +143,8 @@ class MercuryoService( "ADA" -> Blockchain.CardanoShelley else -> Blockchain.values().find { it.currency.lowercase() == currencyName.lowercase() } } + + companion object { + private const val RESPONSE_SUCCESS_STATUS_CODE = 200 + } } diff --git a/app/src/main/java/com/tangem/tap/network/payid/PayIdVerifyApi.kt b/app/src/main/java/com/tangem/tap/network/payid/PayIdVerifyApi.kt index a40231aaf5..8566c89a86 100644 --- a/app/src/main/java/com/tangem/tap/network/payid/PayIdVerifyApi.kt +++ b/app/src/main/java/com/tangem/tap/network/payid/PayIdVerifyApi.kt @@ -11,34 +11,31 @@ import retrofit2.http.Path interface PayIdVerifyApi { @GET("{user}") suspend fun verifyAddress( - @Path("user") user: String, - @Header("Accept") acceptNetworkHeader: String, - @Header("PayID-Version") payIdVersion: String = "1.0" + @Path("user") user: String, + @Header("Accept") acceptNetworkHeader: String, + @Header("PayID-Version") payIdVersion: String = "1.0", ): VerifyPayIdResponse } - @JsonClass(generateAdapter = true) data class VerifyPayIdResponse( - val addresses: List = mutableListOf(), - val payId: String? = null, + val addresses: List = mutableListOf(), + val payId: String? = null, ) { - fun getAddressDetails(): PayIdAddressDetails? { - return if (addresses.isEmpty()) null - else addresses[0].addressDetails - } + fun getAddressDetails(): PayIdAddressDetails? = + if (addresses.isNotEmpty()) addresses[0].addressDetails else null } @JsonClass(generateAdapter = true) data class PayIdAddress( - var paymentNetwork: String, - var environment: String, - var addressDetailsType: String, - var addressDetails: PayIdAddressDetails + var paymentNetwork: String, + var environment: String, + var addressDetailsType: String, + var addressDetails: PayIdAddressDetails, ) @JsonClass(generateAdapter = true) data class PayIdAddressDetails( - var address: String, - var tag: String? = null + var address: String, + var tag: String? = null, ) \ No newline at end of file diff --git a/app/src/main/java/com/tangem/tap/persistence/CardBalanceStateAdapter.kt b/app/src/main/java/com/tangem/tap/persistence/CardBalanceStateAdapter.kt index fe16a0c017..0385071ff3 100644 --- a/app/src/main/java/com/tangem/tap/persistence/CardBalanceStateAdapter.kt +++ b/app/src/main/java/com/tangem/tap/persistence/CardBalanceStateAdapter.kt @@ -14,7 +14,7 @@ class CardBalanceStateAdapter { return when (json) { AnalyticsParam.CardBalanceState.Empty.value -> AnalyticsParam.CardBalanceState.Empty AnalyticsParam.CardBalanceState.Full.value -> AnalyticsParam.CardBalanceState.Full - else -> throw IllegalArgumentException() + else -> error("CardBalanceState not found") } } } \ No newline at end of file diff --git a/app/src/main/java/com/tangem/tap/persistence/PreferencesStorage.kt b/app/src/main/java/com/tangem/tap/persistence/PreferencesStorage.kt index d662cdb29d..a6ff52c139 100644 --- a/app/src/main/java/com/tangem/tap/persistence/PreferencesStorage.kt +++ b/app/src/main/java/com/tangem/tap/persistence/PreferencesStorage.kt @@ -101,11 +101,7 @@ class AppRatingLaunchObserver( private val preferences: SharedPreferences, private val launchCounts: Int, ) { - private val K_SHOW_RATING_AT_LAUNCH_COUNT = "showRatingDialogAtLaunchCount" - private val K_FUNDS_FOUND_DATE = "fundsFoundDate" - private val K_USER_WAS_INTERACT_WITH_RATING = "userWasInteractWithRating" - private val FUNDS_FOUND_DATE_UNDEFINED = -1L private val deferShowing = 20 private val firstShowing = 3 private var fundsFoundDate: Calendar? = null @@ -127,6 +123,7 @@ class AppRatingLaunchObserver( } } + @Suppress("MagicNumber") fun isReadyToShow(): Boolean { val fundsDate = fundsFoundDate ?: return false @@ -144,6 +141,7 @@ class AppRatingLaunchObserver( updateNextShowing(launchCounts + deferShowing) } + @Suppress("MagicNumber") fun setNeverToShow() { updateNextShowing(999999999) } @@ -155,6 +153,16 @@ class AppRatingLaunchObserver( editor.apply() } - private fun userWasInteractWithRating(): Boolean = preferences.getBoolean(K_USER_WAS_INTERACT_WITH_RATING, false) - private fun getCounterOfNextShowing(): Int = preferences.getInt(K_SHOW_RATING_AT_LAUNCH_COUNT, firstShowing) + private fun userWasInteractWithRating(): Boolean = + preferences.getBoolean(K_USER_WAS_INTERACT_WITH_RATING, false) + + private fun getCounterOfNextShowing(): Int = + preferences.getInt(K_SHOW_RATING_AT_LAUNCH_COUNT, firstShowing) + + companion object { + private const val K_SHOW_RATING_AT_LAUNCH_COUNT = "showRatingDialogAtLaunchCount" + private const val K_FUNDS_FOUND_DATE = "fundsFoundDate" + private const val K_USER_WAS_INTERACT_WITH_RATING = "userWasInteractWithRating" + private const val FUNDS_FOUND_DATE_UNDEFINED = -1L + } } \ No newline at end of file diff --git a/app/src/main/java/com/tangem/tap/proxy/TransactionManagerImpl.kt b/app/src/main/java/com/tangem/tap/proxy/TransactionManagerImpl.kt index ba55c7532b..b0889ba759 100644 --- a/app/src/main/java/com/tangem/tap/proxy/TransactionManagerImpl.kt +++ b/app/src/main/java/com/tangem/tap/proxy/TransactionManagerImpl.kt @@ -97,15 +97,12 @@ class TransactionManagerImpl( private fun handleSendResult(result: SimpleResult): SendTxResult { when (result) { - is SimpleResult.Success -> { - return SendTxResult.Success - } + is SimpleResult.Success -> return SendTxResult.Success is SimpleResult.Failure -> { - val error = (result.error as? BlockchainSdkError) ?: return SendTxResult.UnknownError() + val error = result.error as? BlockchainSdkError ?: return SendTxResult.UnknownError() when (error) { is BlockchainSdkError.WrappedTangemError -> { - val tangemSdkError = (error.tangemError as? TangemSdkError) - ?: return SendTxResult.UnknownError() + val tangemSdkError = error.tangemError as? TangemSdkError ?: return SendTxResult.UnknownError() if (tangemSdkError is TangemSdkError.UserCancelled) return SendTxResult.UserCancelledError return SendTxResult.TangemSdkError(tangemSdkError.code, tangemSdkError.cause) } @@ -202,6 +199,5 @@ class TransactionManagerImpl( companion object { private const val HEX_PREFIX = "0x" - private const val DEFAULT_GAS_LIMIT = 300000L } } \ No newline at end of file diff --git a/app/src/main/java/com/tangem/tap/proxy/UserWalletManagerImpl.kt b/app/src/main/java/com/tangem/tap/proxy/UserWalletManagerImpl.kt index 95818b9980..c29c2e92af 100644 --- a/app/src/main/java/com/tangem/tap/proxy/UserWalletManagerImpl.kt +++ b/app/src/main/java/com/tangem/tap/proxy/UserWalletManagerImpl.kt @@ -82,11 +82,7 @@ class UserWalletManagerImpl( override fun addToken(currency: Currency) { val action = if (currency is NativeToken) { val card = appStateHolder.getActualCard() - if (card != null) { - addNativeTokenToWalletAction(currency, card) - } else { - throw IllegalStateException("card not found") - } + if (card != null) addNativeTokenToWalletAction(currency, card) else error("Card not found") } else { addNonNativeTokenToWalletAction(currency as NonNativeToken) } @@ -184,12 +180,15 @@ class UserWalletManagerImpl( } private fun createDerivationParams(derivationStyle: DerivationStyle?): DerivationParams? { - return derivationStyle?.let { DerivationParams.Default(derivationStyle) } //todo clarify if its need to add Custom + //todo clarify if its need to add Custom + return derivationStyle?.let { DerivationParams.Default(derivationStyle) } } private fun getActualWalletManager(blockchain: Blockchain): WalletManager { val card = requireNotNull(appStateHolder.getActualCard()) { "card not found" } val blockchainNetwork = BlockchainNetwork(blockchain, card) - return requireNotNull(appStateHolder.walletState?.getWalletManager(blockchainNetwork)) { "no wallet manager found" } + return requireNotNull(appStateHolder.walletState?.getWalletManager(blockchainNetwork)) { + "No wallet manager found" + } } } \ No newline at end of file diff --git a/app/src/test/java/com/tangem/wallet/ExampleUnitTest.kt b/app/src/test/java/com/tangem/wallet/ExampleUnitTest.kt deleted file mode 100644 index ead7134648..0000000000 --- a/app/src/test/java/com/tangem/wallet/ExampleUnitTest.kt +++ /dev/null @@ -1,17 +0,0 @@ -package com.tangem.wallet - -import org.junit.Assert.assertEquals -import org.junit.Test - - -/** - * Example local unit test, which will execute on the development machine (host). - * - * See [testing documentation](http://d.android.com/tools/testing). - */ -class ExampleUnitTest { - @Test - fun addition_isCorrect() { - assertEquals(4, 2 + 2) - } -} \ No newline at end of file diff --git a/common/src/main/java/com/tangem/common/module/ModuleMessage.kt b/common/src/main/java/com/tangem/common/module/ModuleMessage.kt index c8632c9597..511ffa8d99 100644 --- a/common/src/main/java/com/tangem/common/module/ModuleMessage.kt +++ b/common/src/main/java/com/tangem/common/module/ModuleMessage.kt @@ -11,7 +11,7 @@ interface ModuleMessage * @property message the error description * @property data any data that can help in the part where this error is being handled */ -abstract class ModuleError() : Throwable(), ModuleMessage { +abstract class ModuleError : Throwable(), ModuleMessage { abstract val code: Int abstract override val message: String abstract val data: Any? diff --git a/config/detekt/detekt.yml b/config/detekt/detekt.yml index 306dcd59df..3022bed25f 100644 --- a/config/detekt/detekt.yml +++ b/config/detekt/detekt.yml @@ -613,10 +613,11 @@ style: active: true UnusedPrivateClass: active: true + ignoreAnnotated: ['UnusedRequiredComponent'] UnusedPrivateMember: active: true allowedNames: '(_|ignored|expected|serialVersionUID)' - ignoreAnnotated: ['Preview'] + ignoreAnnotated: ['Preview', 'UnusedRequiredComponent'] UseAnyOrNoneInsteadOfFind: active: true UseArrayLiteralsInAnnotations: diff --git a/core/analytics/src/main/java/com/tangem/core/analytics/api/ClientApi.kt b/core/analytics/src/main/java/com/tangem/core/analytics/api/ClientApi.kt index d4a9b22842..0989dfaad4 100644 --- a/core/analytics/src/main/java/com/tangem/core/analytics/api/ClientApi.kt +++ b/core/analytics/src/main/java/com/tangem/core/analytics/api/ClientApi.kt @@ -1,4 +1,4 @@ -package com.tangem.analytics.api +package com.tangem.core.analytics.api /** [REDACTED_AUTHOR] diff --git a/core/datasource/src/main/java/com/tangem/datasource/api/common/Adapters.kt b/core/datasource/src/main/java/com/tangem/datasource/api/common/BigDecimalAdapter.kt similarity index 100% rename from core/datasource/src/main/java/com/tangem/datasource/api/common/Adapters.kt rename to core/datasource/src/main/java/com/tangem/datasource/api/common/BigDecimalAdapter.kt diff --git a/core/datasource/src/main/java/com/tangem/datasource/api/common/Retrofit.kt b/core/datasource/src/main/java/com/tangem/datasource/api/common/Retrofit.kt index 86b4ec51f4..166036783c 100644 --- a/core/datasource/src/main/java/com/tangem/datasource/api/common/Retrofit.kt +++ b/core/datasource/src/main/java/com/tangem/datasource/api/common/Retrofit.kt @@ -6,6 +6,7 @@ import okhttp3.logging.HttpLoggingInterceptor import retrofit2.Retrofit import java.util.concurrent.TimeUnit +@Suppress("MagicNumber") @Deprecated("Create and provide by DI") fun createRetrofitInstance( baseUrl: String, diff --git a/core/datasource/src/main/java/com/tangem/datasource/api/tangemTech/models/RateResponse.kt b/core/datasource/src/main/java/com/tangem/datasource/api/tangemTech/models/RatesResponse.kt similarity index 100% rename from core/datasource/src/main/java/com/tangem/datasource/api/tangemTech/models/RateResponse.kt rename to core/datasource/src/main/java/com/tangem/datasource/api/tangemTech/models/RatesResponse.kt diff --git a/core/ui/src/main/java/com/tangem/core/ui/components/Buttons.kt b/core/ui/src/main/java/com/tangem/core/ui/components/Buttons.kt index 57ea5a799d..c3b2ef1f2c 100644 --- a/core/ui/src/main/java/com/tangem/core/ui/components/Buttons.kt +++ b/core/ui/src/main/java/com/tangem/core/ui/components/Buttons.kt @@ -232,6 +232,7 @@ fun SecondaryButtonIconLeft( } // region Defaults +@Suppress("LongParameterList") @Composable private fun TangemButton( modifier: Modifier = Modifier, @@ -286,29 +287,31 @@ private fun ButtonContent( ) } - if (showProgress) Box( - modifier = Modifier.wrapContentSize(), - ) { - CircularProgressIndicator( - modifier = Modifier - .align(Alignment.Center) - .size(TangemTheme.dimens.size24), - color = colors.contentColor(enabled = enabled).value, - strokeWidth = TangemTheme.dimens.size4, - ) - } else Row { - if (buttonIcon is TangemButtonIcon.Left) { - icon(buttonIcon.painter) - Spacer(modifier = Modifier.width(TangemTheme.dimens.size8)) + if (showProgress) { + Box(modifier = Modifier.wrapContentSize()) { + CircularProgressIndicator( + modifier = Modifier + .align(Alignment.Center) + .size(TangemTheme.dimens.size24), + color = colors.contentColor(enabled = enabled).value, + strokeWidth = TangemTheme.dimens.size4, + ) } - Text( - text = text, - style = TangemTypography.button, - color = colors.contentColor(enabled = enabled).value, - ) - if (buttonIcon is TangemButtonIcon.Right) { - Spacer(modifier = Modifier.width(TangemTheme.dimens.size8)) - icon(buttonIcon.painter) + } else { + Row { + if (buttonIcon is TangemButtonIcon.Left) { + icon(buttonIcon.painter) + Spacer(modifier = Modifier.width(TangemTheme.dimens.size8)) + } + Text( + text = text, + style = TangemTypography.button, + color = colors.contentColor(enabled = enabled).value, + ) + if (buttonIcon is TangemButtonIcon.Right) { + Spacer(modifier = Modifier.width(TangemTheme.dimens.size8)) + icon(buttonIcon.painter) + } } } } diff --git a/core/ui/src/main/java/com/tangem/core/ui/components/Cards.kt b/core/ui/src/main/java/com/tangem/core/ui/components/Cards.kt index 0362d05890..db9c45339f 100644 --- a/core/ui/src/main/java/com/tangem/core/ui/components/Cards.kt +++ b/core/ui/src/main/java/com/tangem/core/ui/components/Cards.kt @@ -142,7 +142,8 @@ fun SmallInfoCardWithWarning( * @param icon icon to the left * @param additionalContent shown at the right edge of the card * - * @see Figma component */ @Composable @@ -177,7 +178,8 @@ fun CardWithIcon( * @param icon icon to the left * @param additionalContent shown at the right edge of the card * - * @see Figma component */ @Composable @@ -290,6 +292,7 @@ private fun CardInfoBox( // region Preview +@Suppress("MagicNumber") @Composable private fun CardsPreview() { Column(modifier = Modifier.fillMaxWidth()) { @@ -300,8 +303,8 @@ private fun CardsPreview() { SmallInfoCardWithWarning( startText = "Balance", endText = "0.4405434 BTC", - warningText = - "Not enough funds for fee on your Polygon wallet to create a transaction. Top up your Polygon wallet first.", + warningText = "Not enough funds for fee on your Polygon wallet to create a transaction. " + + "Top up your Polygon wallet first.", ) SpacerH32() diff --git a/core/ui/src/main/java/com/tangem/core/ui/components/Dialogs.kt b/core/ui/src/main/java/com/tangem/core/ui/components/Dialogs.kt index b9f323d670..5afa4620fa 100644 --- a/core/ui/src/main/java/com/tangem/core/ui/components/Dialogs.kt +++ b/core/ui/src/main/java/com/tangem/core/ui/components/Dialogs.kt @@ -102,7 +102,8 @@ private fun SimpleOkDialogPreview() = SimpleOkDialog( @Composable private fun BasicDialogPreview() = BasicDialog( - message = "All protected passwords will be deleted from the secure storage, you must enter the wallet password to work with the app", + message = "All protected passwords will be deleted from the secure storage, you must enter the wallet password " + + "to work with the app", title = "Attention", confirmButton = DialogButton {}, dismissButton = DialogButton {}, diff --git a/core/ui/src/main/java/com/tangem/core/ui/components/KeybosardState.kt b/core/ui/src/main/java/com/tangem/core/ui/components/Keyboard.kt similarity index 98% rename from core/ui/src/main/java/com/tangem/core/ui/components/KeybosardState.kt rename to core/ui/src/main/java/com/tangem/core/ui/components/Keyboard.kt index 69d24e6980..a7ae0f67b7 100644 --- a/core/ui/src/main/java/com/tangem/core/ui/components/KeybosardState.kt +++ b/core/ui/src/main/java/com/tangem/core/ui/components/Keyboard.kt @@ -18,6 +18,7 @@ sealed class Keyboard { /** * Allows to subscribe to a soft keyboard to detect when it's open/closed */ +@Suppress("MagicNumber") @Composable fun keyboardAsState(): State { val keyboardState: MutableState = remember { mutableStateOf(Keyboard.Closed) } diff --git a/core/ui/src/main/java/com/tangem/core/ui/components/ResizableText.kt b/core/ui/src/main/java/com/tangem/core/ui/components/ResizableText.kt index 4b7fe2c1ac..9067f17fd4 100644 --- a/core/ui/src/main/java/com/tangem/core/ui/components/ResizableText.kt +++ b/core/ui/src/main/java/com/tangem/core/ui/components/ResizableText.kt @@ -12,6 +12,7 @@ import androidx.compose.ui.text.TextStyle import androidx.compose.ui.unit.TextUnit import androidx.compose.ui.unit.sp +@Suppress("MagicNumber") @Composable fun ResizableText( text: String, diff --git a/core/ui/src/main/java/com/tangem/core/ui/components/Spacers.kt b/core/ui/src/main/java/com/tangem/core/ui/components/Spacers.kt index b333d58fdf..15ba170e20 100644 --- a/core/ui/src/main/java/com/tangem/core/ui/components/Spacers.kt +++ b/core/ui/src/main/java/com/tangem/core/ui/components/Spacers.kt @@ -1,4 +1,4 @@ -@file:Suppress("unused") +@file:Suppress("TooManyFunctions") package com.tangem.core.ui.components @@ -88,6 +88,7 @@ fun ColumnScope.SpacerHMax(modifier: Modifier = Modifier) { } // TODO: Refactor with context receivers +@Suppress("MagicNumber") @Composable fun ColumnScope.SpacerHHalf(modifier: Modifier = Modifier) { Spacer(modifier = modifier.weight(.5f)) diff --git a/core/ui/src/main/java/com/tangem/core/ui/components/SuccessScreen.kt b/core/ui/src/main/java/com/tangem/core/ui/components/SuccessScreen.kt index c87490b133..ce91939f5e 100644 --- a/core/ui/src/main/java/com/tangem/core/ui/components/SuccessScreen.kt +++ b/core/ui/src/main/java/com/tangem/core/ui/components/SuccessScreen.kt @@ -40,7 +40,8 @@ import com.tangem.core.ui.res.TangemTheme * @param onSecondaryButtonClick action on clicking secondary button * @param onButtonClick action on clicking "Done" button * - * @see Figma component */ @Composable @@ -113,8 +114,7 @@ fun SuccessImage( Box( modifier = Modifier .background( - color = (resultColor) - .copy(alpha = 0.2f), + color = resultColor.copy(alpha = 0.2f), shape = CircleShape, ), contentAlignment = Alignment.Center, diff --git a/core/ui/src/main/java/com/tangem/core/ui/components/TextFields.kt b/core/ui/src/main/java/com/tangem/core/ui/components/TextFields.kt index 1ac3d8e677..a0459b8dc4 100644 --- a/core/ui/src/main/java/com/tangem/core/ui/components/TextFields.kt +++ b/core/ui/src/main/java/com/tangem/core/ui/components/TextFields.kt @@ -79,6 +79,7 @@ fun OutlineTextField( } // region Defaults +@Suppress("LongMethod") @Composable private fun TangemTextField( modifier: Modifier = Modifier, diff --git a/core/ui/src/main/java/com/tangem/core/ui/components/appbar/AppBarWithSearch.kt b/core/ui/src/main/java/com/tangem/core/ui/components/appbar/AppBarWithSearch.kt index 37b0acc905..4d147b65fc 100644 --- a/core/ui/src/main/java/com/tangem/core/ui/components/appbar/AppBarWithSearch.kt +++ b/core/ui/src/main/java/com/tangem/core/ui/components/appbar/AppBarWithSearch.kt @@ -48,7 +48,8 @@ import com.tangem.core.ui.res.TangemTheme * @param onSearchChanged action when search is modified * @param onSearchDisplayClosed action when search is closed * - * @see Figma component */ @Composable @@ -89,15 +90,6 @@ fun ExpandableSearchView( } } -@Composable -private fun SearchIcon(iconTint: Color) { - Icon( - painter = painterResource(id = R.drawable.ic_search_24), - contentDescription = null, - tint = iconTint, - ) -} - @Composable private fun CollapsedSearchView( modifier: Modifier = Modifier, @@ -151,16 +143,13 @@ private fun ExpandedSearchView( tint: Color = TangemTheme.colors.background.primary, ) { val focusManager = LocalFocusManager.current - val textFieldFocusRequester = remember { FocusRequester() } SideEffect { textFieldFocusRequester.requestFocus() } - var textFieldValue by remember { - mutableStateOf(TextFieldValue("", TextRange("".length))) - } + var textFieldValue by remember { mutableStateOf(TextFieldValue("", TextRange("".length))) } Row( modifier = modifier @@ -194,22 +183,17 @@ private fun ExpandedSearchView( placeholder = { Text(text = placeholderSearchText) }, - keyboardOptions = KeyboardOptions( - imeAction = ImeAction.Done, - ), + keyboardOptions = KeyboardOptions(imeAction = ImeAction.Done), keyboardActions = KeyboardActions( - onDone = { - focusManager.clearFocus() - }, + onDone = { focusManager.clearFocus() }, + ), + colors = TangemTextFieldsDefault.defaultTextFieldColors.copy( + placeholderColor = TangemTheme.colors.text.disabled, + cursorColor = TangemTheme.colors.text.tertiary, + focusedIndicatorColor = Color.Transparent, + unfocusedIndicatorColor = Color.Transparent, + disabledIndicatorColor = Color.Transparent, ), - colors = TangemTextFieldsDefault.defaultTextFieldColors - .copy( - placeholderColor = TangemTheme.colors.text.disabled, - cursorColor = TangemTheme.colors.text.tertiary, - focusedIndicatorColor = Color.Transparent, - unfocusedIndicatorColor = Color.Transparent, - disabledIndicatorColor = Color.Transparent, - ), ) } } diff --git a/core/ui/src/main/java/com/tangem/core/ui/extensions/Blockchain.kt b/core/ui/src/main/java/com/tangem/core/ui/extensions/Blockchain.kt index 052f2f26b6..200c7a08ed 100644 --- a/core/ui/src/main/java/com/tangem/core/ui/extensions/Blockchain.kt +++ b/core/ui/src/main/java/com/tangem/core/ui/extensions/Blockchain.kt @@ -3,6 +3,7 @@ package com.tangem.core.ui.extensions import androidx.annotation.DrawableRes import com.tangem.core.ui.R +@Suppress("ComplexMethod") @DrawableRes fun getActiveIconRes(blockchainId: String): Int { return when (blockchainId) { diff --git a/core/ui/src/main/java/com/tangem/core/ui/res/ButtonColor.kt b/core/ui/src/main/java/com/tangem/core/ui/res/ButtonColorType.kt similarity index 89% rename from core/ui/src/main/java/com/tangem/core/ui/res/ButtonColor.kt rename to core/ui/src/main/java/com/tangem/core/ui/res/ButtonColorType.kt index 427be16fe5..5eb3a3fcff 100644 --- a/core/ui/src/main/java/com/tangem/core/ui/res/ButtonColor.kt +++ b/core/ui/src/main/java/com/tangem/core/ui/res/ButtonColorType.kt @@ -21,4 +21,4 @@ enum class ButtonColorType(val lightColor: Color, val darkColor: Color) { } @Composable -fun Colors.buttonColor(type: ButtonColorType): Color = if (isSystemInDarkTheme) type.darkColor else type.lightColor \ No newline at end of file +fun Colors.buttonColor(type: ButtonColorType): Color = if (IS_SYSTEM_IN_DARK_THEME) type.darkColor else type.lightColor \ No newline at end of file diff --git a/core/ui/src/main/java/com/tangem/core/ui/res/IconColor.kt b/core/ui/src/main/java/com/tangem/core/ui/res/IconColorType.kt similarity index 92% rename from core/ui/src/main/java/com/tangem/core/ui/res/IconColor.kt rename to core/ui/src/main/java/com/tangem/core/ui/res/IconColorType.kt index 11dab52a7b..9fa83581b6 100644 --- a/core/ui/src/main/java/com/tangem/core/ui/res/IconColor.kt +++ b/core/ui/src/main/java/com/tangem/core/ui/res/IconColorType.kt @@ -28,4 +28,4 @@ enum class IconColorType(val lightColor: Color, val darkColor: Color) { } @Composable -fun Colors.iconColor(type: IconColorType): Color = if (isSystemInDarkTheme) type.darkColor else type.lightColor \ No newline at end of file +fun Colors.iconColor(type: IconColorType): Color = if (IS_SYSTEM_IN_DARK_THEME) type.darkColor else type.lightColor \ No newline at end of file diff --git a/core/ui/src/main/java/com/tangem/core/ui/res/TangemColors.kt b/core/ui/src/main/java/com/tangem/core/ui/res/TangemColors.kt index 371e70d22e..8dc45fd453 100644 --- a/core/ui/src/main/java/com/tangem/core/ui/res/TangemColors.kt +++ b/core/ui/src/main/java/com/tangem/core/ui/res/TangemColors.kt @@ -6,7 +6,7 @@ import androidx.compose.runtime.mutableStateOf import androidx.compose.runtime.setValue import androidx.compose.ui.graphics.Color -@Suppress("unused", "MemberVisibilityCanBePrivate") +@Suppress("LongParameterList") @Stable class TangemColors internal constructor( text: Text, diff --git a/core/ui/src/main/java/com/tangem/core/ui/res/TangemDimens.kt b/core/ui/src/main/java/com/tangem/core/ui/res/TangemDimens.kt index c97f04e9f0..fee6cc5fe9 100644 --- a/core/ui/src/main/java/com/tangem/core/ui/res/TangemDimens.kt +++ b/core/ui/src/main/java/com/tangem/core/ui/res/TangemDimens.kt @@ -4,6 +4,7 @@ import androidx.compose.runtime.Immutable import androidx.compose.ui.unit.Dp import androidx.compose.ui.unit.dp +@Suppress("ConstructorParameterNaming") @Immutable data class TangemDimens internal constructor( // region Elevation diff --git a/core/ui/src/main/java/com/tangem/core/ui/res/TangemTheme.kt b/core/ui/src/main/java/com/tangem/core/ui/res/TangemTheme.kt index 8ff81a2640..8239973f6a 100644 --- a/core/ui/src/main/java/com/tangem/core/ui/res/TangemTheme.kt +++ b/core/ui/src/main/java/com/tangem/core/ui/res/TangemTheme.kt @@ -11,7 +11,8 @@ import androidx.compose.runtime.Stable import androidx.compose.runtime.remember import androidx.compose.runtime.staticCompositionLocalOf -internal val isSystemInDarkTheme: Boolean = false // TODO: use isSystemInDarkTheme() for automatic color detection +// TODO: use isSystemInDarkTheme() for automatic color detection +internal const val IS_SYSTEM_IN_DARK_THEME: Boolean = false @Composable fun TangemTheme( diff --git a/core/ui/src/main/java/com/tangem/core/ui/res/TextColor.kt b/core/ui/src/main/java/com/tangem/core/ui/res/TextColorType.kt similarity index 92% rename from core/ui/src/main/java/com/tangem/core/ui/res/TextColor.kt rename to core/ui/src/main/java/com/tangem/core/ui/res/TextColorType.kt index 0fce11d9e7..5b726844aa 100644 --- a/core/ui/src/main/java/com/tangem/core/ui/res/TextColor.kt +++ b/core/ui/src/main/java/com/tangem/core/ui/res/TextColorType.kt @@ -28,4 +28,4 @@ enum class TextColorType(val lightColor: Color, val darkColor: Color) { } @Composable -fun Colors.textColor(type: TextColorType): Color = if (isSystemInDarkTheme) type.darkColor else type.lightColor \ No newline at end of file +fun Colors.textColor(type: TextColorType): Color = if (IS_SYSTEM_IN_DARK_THEME) type.darkColor else type.lightColor \ No newline at end of file diff --git a/core/utils/src/main/java/com/tangem/utils/FormatExtensions.kt b/core/utils/src/main/java/com/tangem/utils/FormatExtensions.kt index 46b5621758..261e6811de 100644 --- a/core/utils/src/main/java/com/tangem/utils/FormatExtensions.kt +++ b/core/utils/src/main/java/com/tangem/utils/FormatExtensions.kt @@ -24,7 +24,7 @@ fun BigDecimal.toFormattedString( fun BigDecimal.toFiatString( rateValue: BigDecimal, fiatCurrencyName: String, - formatWithSpaces: Boolean = false + formatWithSpaces: Boolean = false, ): String { val fiatValue = rateValue.multiply(this) return fiatValue.toFormattedFiatValue(fiatCurrencyName, formatWithSpaces) @@ -32,13 +32,14 @@ fun BigDecimal.toFiatString( fun BigDecimal.toFormattedFiatValue( fiatCurrencyName: String, - formatWithSpaces: Boolean = false + formatWithSpaces: Boolean = false, ): String { val fiatValue = this.setScale(2, RoundingMode.HALF_UP) .let { if (formatWithSpaces) it.formatWithSpaces() else it } return " ${fiatValue}  $fiatCurrencyName" } +@Suppress("MagicNumber") fun BigDecimal.formatWithSpaces(): String { val str = this.toString() var integerStr = str.substringBefore('.') diff --git a/core/utils/src/main/java/com/tangem/utils/coroutines/FeatureCoroutineExceptionHandler.kt b/core/utils/src/main/java/com/tangem/utils/coroutines/FeatureCoroutineExceptionHandler.kt index 71cea0fb21..6075186448 100644 --- a/core/utils/src/main/java/com/tangem/utils/coroutines/FeatureCoroutineExceptionHandler.kt +++ b/core/utils/src/main/java/com/tangem/utils/coroutines/FeatureCoroutineExceptionHandler.kt @@ -9,19 +9,17 @@ import java.util.logging.Logger /** [REDACTED_AUTHOR] */ -class FeatureCoroutineExceptionHandler { +object FeatureCoroutineExceptionHandler { // add an external logger (FbAnalytics) for handling errors - companion object { - fun create(from: String): CoroutineExceptionHandler = CoroutineExceptionHandler { _, throwable -> - val sw = StringWriter() - throwable.printStackTrace(PrintWriter(sw)) - val exceptionAsString: String = sw.toString() - //it delegates logging to android Logger, cause cant use timber in java module - Logger.getLogger("CoroutineExceptHandler").log( - Level.INFO, "CoroutineException: from: $from, exception: $exceptionAsString", - ) - throw throwable - } + fun create(from: String): CoroutineExceptionHandler = CoroutineExceptionHandler { _, throwable -> + val sw = StringWriter() + throwable.printStackTrace(PrintWriter(sw)) + val exceptionAsString: String = sw.toString() + //it delegates logging to android Logger, cause cant use timber in java module + Logger.getLogger("CoroutineExceptHandler").log( + Level.INFO, "CoroutineException: from: $from, exception: $exceptionAsString", + ) + throw throwable } } \ No newline at end of file diff --git a/core/utils/src/main/java/com/tangem/utils/detekt/UnusedRequiredComponent.kt b/core/utils/src/main/java/com/tangem/utils/detekt/UnusedRequiredComponent.kt new file mode 100644 index 0000000000..05e6016541 --- /dev/null +++ b/core/utils/src/main/java/com/tangem/utils/detekt/UnusedRequiredComponent.kt @@ -0,0 +1,28 @@ +package com.tangem.utils.detekt + +/** + * Annotation for an unused component that should be ignored by Detekt + * + * @property description description of why I shouldn't remove it + * +[REDACTED_AUTHOR] + */ +@Target( + AnnotationTarget.CLASS, + AnnotationTarget.ANNOTATION_CLASS, + AnnotationTarget.TYPE_PARAMETER, + AnnotationTarget.PROPERTY, + AnnotationTarget.FIELD, + AnnotationTarget.LOCAL_VARIABLE, + AnnotationTarget.VALUE_PARAMETER, + AnnotationTarget.CONSTRUCTOR, + AnnotationTarget.FUNCTION, + AnnotationTarget.PROPERTY_GETTER, + AnnotationTarget.PROPERTY_SETTER, + AnnotationTarget.TYPE, + AnnotationTarget.EXPRESSION, + AnnotationTarget.FILE, + AnnotationTarget.TYPEALIAS +) +@Retention(AnnotationRetention.SOURCE) +annotation class UnusedRequiredComponent(val description: String) diff --git a/core/utils/src/main/java/com/tangem/utils/di/CoroutineDispatcherProviderModule.kt b/core/utils/src/main/java/com/tangem/utils/di/CoroutineDispatcherProviderModule.kt index df85354292..6dd1011462 100644 --- a/core/utils/src/main/java/com/tangem/utils/di/CoroutineDispatcherProviderModule.kt +++ b/core/utils/src/main/java/com/tangem/utils/di/CoroutineDispatcherProviderModule.kt @@ -12,5 +12,7 @@ import dagger.hilt.components.SingletonComponent interface CoroutineDispatcherProviderModule { @Binds - fun bindCoroutineDispatcherProvider(coroutineDispatcherProvider: AppCoroutineDispatcherProvider): CoroutineDispatcherProvider + fun bindCoroutineDispatcherProvider( + coroutineDispatcherProvider: AppCoroutineDispatcherProvider, + ): CoroutineDispatcherProvider } \ No newline at end of file diff --git a/domain/src/main/java/com/tangem/domain/DomainLayer.kt b/domain/src/main/java/com/tangem/domain/DomainLayer.kt index ef083fdc96..a8a52c2d4e 100644 --- a/domain/src/main/java/com/tangem/domain/DomainLayer.kt +++ b/domain/src/main/java/com/tangem/domain/DomainLayer.kt @@ -12,7 +12,7 @@ object DomainLayer { var onInitComplete: ((DomainModuleError?) -> Unit)? = null - fun init(data: Map? = null) { + fun init() { initActionStateLogger() onInitComplete?.invoke(null) diff --git a/domain/src/main/java/com/tangem/domain/common/CardDTO.kt b/domain/src/main/java/com/tangem/domain/common/CardDTO.kt index 58df56c687..1d20c068a4 100644 --- a/domain/src/main/java/com/tangem/domain/common/CardDTO.kt +++ b/domain/src/main/java/com/tangem/domain/common/CardDTO.kt @@ -48,6 +48,7 @@ data class CardDTO( backupStatus = BackupStatus.fromSdkStatus(card.backupStatus), ) + @Suppress("ComplexMethod") override fun equals(other: Any?): Boolean { if (this === other) return true if (other !is CardDTO) return false @@ -120,13 +121,6 @@ data class CardDTO( val patch: Int, val type: SdkFirmwareVersion.FirmwareType, ) : Comparable { - constructor(firmwareVersion: SdkFirmwareVersion) : this( - major = firmwareVersion.major, - minor = firmwareVersion.minor, - patch = firmwareVersion.patch, - type = firmwareVersion.type, - ) - val stringValue: String get() = StringBuilder() .append("$major.$minor") @@ -134,6 +128,13 @@ data class CardDTO( .append(type.rawValue ?: "") .toString() + constructor(firmwareVersion: SdkFirmwareVersion) : this( + major = firmwareVersion.major, + minor = firmwareVersion.minor, + patch = firmwareVersion.patch, + type = firmwareVersion.type, + ) + override fun compareTo(other: SdkFirmwareVersion): Int = when { major != other.major -> major.compareTo(other.major) minor != other.minor -> minor.compareTo(other.minor) diff --git a/domain/src/main/java/com/tangem/domain/common/LogConfig.kt b/domain/src/main/java/com/tangem/domain/common/LogConfig.kt index ebe3cef306..f0626bf715 100644 --- a/domain/src/main/java/com/tangem/domain/common/LogConfig.kt +++ b/domain/src/main/java/com/tangem/domain/common/LogConfig.kt @@ -3,22 +3,21 @@ package com.tangem.domain.common import com.tangem.domain.features.BuildConfig object LogConfig { - val imageLoader: Boolean = false + const val imageLoader: Boolean = false val storeAction: Boolean = BuildConfig.DEBUG - val zendesk: Boolean = false + const val zendesk: Boolean = false val network: NetworkLogConfig = NetworkLogConfig val analyticsHandlers: AnalyticsHandlersLogConfig = AnalyticsHandlersLogConfig } object NetworkLogConfig { - val mercuryoService: Boolean = false - val moonPayService: Boolean = false - val paymentologyApiService: Boolean = BuildConfig.DEBUG + const val mercuryoService: Boolean = false + const val moonPayService: Boolean = false val blockchainSdkNetwork: Boolean = BuildConfig.DEBUG } object AnalyticsHandlersLogConfig { - val firebase: Boolean = false - val appsFlyer: Boolean = false - val amplitude: Boolean = false + const val firebase: Boolean = false + const val appsFlyer: Boolean = false + const val amplitude: Boolean = false } \ No newline at end of file diff --git a/domain/src/main/java/com/tangem/domain/common/SaltPayWorkaround.kt b/domain/src/main/java/com/tangem/domain/common/SaltPayWorkaround.kt index 1328643534..58c03985a6 100644 --- a/domain/src/main/java/com/tangem/domain/common/SaltPayWorkaround.kt +++ b/domain/src/main/java/com/tangem/domain/common/SaltPayWorkaround.kt @@ -6,35 +6,8 @@ import com.tangem.common.CardIdRange import com.tangem.common.contains object SaltPayWorkaround { - fun tokenFrom(blockchain: Blockchain): Token { - return when (blockchain) { - Blockchain.SaltPay -> Token( - name = "WXDAI", - symbol = "wxDAI", - contractAddress = "0x4200000000000000000000000000000000000006", - decimals = 18, - id = "wrapped-xdai", - ) - else -> throw IllegalArgumentException() - } - } - - fun isVisaBatchId(batchId: String): Boolean = visaBatches.contains(batchId) - - fun isWalletCardId(cardId: String): Boolean { - return if (walletCardIds.contains(cardId)) true else walletCardIdRanges.contains(cardId) - } - - val visaBatches = listOf( - "AE02", - "AE03", - ) + attachTestVisaBatches() - - private fun attachTestVisaBatches(): List { - return listOf( - "FF03", - ) - } + @Suppress("MagicNumber") + val visaBatches = listOf("AE02", "AE03") + attachTestVisaBatches() val walletCardIds = listOf( "AC01000000033503", @@ -67,19 +40,38 @@ object SaltPayWorkaround { "AC03000000076229", ) + attachTestWalletCardIds() - private fun attachTestWalletCardIds(): List { - return listOf( - "FF04000000000232", - ) - } - val walletCardIdRanges = listOf( CardIdRange("AC05000000000003", "AC05000000023997")!!, ) + attachTestWalletCardIdRanges() + fun tokenFrom(blockchain: Blockchain): Token { + return when (blockchain) { + Blockchain.SaltPay -> Token( + name = "WXDAI", + symbol = "wxDAI", + contractAddress = "0x4200000000000000000000000000000000000006", + decimals = 18, + id = "wrapped-xdai", + ) + else -> error("It is not SaltPay") + } + } + + fun isVisaBatchId(batchId: String): Boolean = visaBatches.contains(batchId) + + fun isWalletCardId(cardId: String): Boolean { + return if (walletCardIds.contains(cardId)) true else walletCardIdRanges.contains(cardId) + } + + private fun attachTestVisaBatches(): List { + return listOf("FF03") + } + + private fun attachTestWalletCardIds(): List { + return listOf("FF04000000000232") + } + private fun attachTestWalletCardIdRanges(): List { - return listOf( - CardIdRange("FF04000000000000", "FF04999999999999")!!, - ) + return listOf(CardIdRange("FF04000000000000", "FF04999999999999")!!) } } \ No newline at end of file diff --git a/domain/src/main/java/com/tangem/domain/common/TapWorkarounds.kt b/domain/src/main/java/com/tangem/domain/common/TapWorkarounds.kt index 21fa7e169f..cf9c502268 100644 --- a/domain/src/main/java/com/tangem/domain/common/TapWorkarounds.kt +++ b/domain/src/main/java/com/tangem/domain/common/TapWorkarounds.kt @@ -13,10 +13,6 @@ object TapWorkarounds { private const val TEST_CARD_BATCH = "99FF" private const val TEST_CARD_ID_STARTS_WITH = "FF99" - fun isStart2CoinIssuer(cardIssuer: String?): Boolean { - return cardIssuer?.lowercase(Locale.US) == START_2_COIN_ISSUER - } - val CardDTO.isTangemTwins: Boolean get() = TwinsHelper.getTwinCardNumber(cardId) != null @@ -41,6 +37,7 @@ object TapWorkarounds { val CardDTO.useOldStyleDerivation: Boolean get() = batchId == "AC01" || batchId == "AC02" || batchId == "CB95" + val CardDTO.derivationStyle: DerivationStyle? get() = if (!settings.isHDWalletAllowed) { null @@ -49,7 +46,6 @@ object TapWorkarounds { } else { DerivationStyle.NEW } - val CardDTO.isExcluded: Boolean get() { val excludedBatch = excludedBatches.contains(batchId) @@ -60,9 +56,6 @@ object TapWorkarounds { val CardDTO.isNotSupportedInThatRelease: Boolean get() = false - fun CardDTO.getTangemNoteBlockchain(): Blockchain? = - tangemNoteBatches[batchId] ?: if (isSaltPay) Blockchain.Gnosis else null - private val tangemNoteBatches = mapOf( "AB01" to Blockchain.Bitcoin, "AB02" to Blockchain.Ethereum, @@ -78,16 +71,16 @@ object TapWorkarounds { "AB12" to Blockchain.Ethereum, ) + private val excludedBatches = listOf("0027", "0030", "0031", "0035") + + private val excludedIssuers = listOf("TTM BANK") + + fun CardDTO.getTangemNoteBlockchain(): Blockchain? = + tangemNoteBatches[batchId] ?: if (isSaltPay) Blockchain.Gnosis else null + + fun isStart2CoinIssuer(cardIssuer: String?): Boolean { + return cardIssuer?.lowercase(Locale.US) == START_2_COIN_ISSUER + } + fun Card.getTangemNoteBlockchain(): Blockchain? = tangemNoteBatches[batchId] ?: null - - private val excludedBatches = listOf( - "0027", - "0030", - "0031", - "0035", - ) - - private val excludedIssuers = listOf( - "TTM BANK", - ) } \ No newline at end of file diff --git a/domain/src/main/java/com/tangem/domain/common/TwinsHelper.kt b/domain/src/main/java/com/tangem/domain/common/TwinsHelper.kt index a1ded44422..7e801695fb 100644 --- a/domain/src/main/java/com/tangem/domain/common/TwinsHelper.kt +++ b/domain/src/main/java/com/tangem/domain/common/TwinsHelper.kt @@ -2,47 +2,32 @@ package com.tangem.domain.common import com.tangem.crypto.CryptoUtils -class TwinsHelper { - companion object { - const val TWIN_FILE_NAME = "TwinPublicKey" +object TwinsHelper { + private val firstCardSeries = listOf("CB61", "CB64") + private val secondCardSeries = listOf("CB62", "CB65") - fun verifyTwinPublicKey(issuerData: ByteArray, cardWalletPublicKey: ByteArray?): Boolean { - if (issuerData.size < 65 || cardWalletPublicKey == null) return false + @Suppress("MagicNumber") + fun verifyTwinPublicKey(issuerData: ByteArray, cardWalletPublicKey: ByteArray?): Boolean { + if (issuerData.size < 65 || cardWalletPublicKey == null) return false - val publicKey = issuerData.sliceArray(0 until 65) - val signedKey = issuerData.sliceArray(65 until issuerData.size) - return CryptoUtils.verify(cardWalletPublicKey, publicKey, signedKey) - } + val publicKey = issuerData.sliceArray(0 until 65) + val signedKey = issuerData.sliceArray(65 until issuerData.size) + return CryptoUtils.verify(cardWalletPublicKey, publicKey, signedKey) + } - fun getTwinCardNumber(cardId: String): TwinCardNumber? = when { - firstCardSeries.any(cardId::startsWith) -> TwinCardNumber.First - secondCardSeries.any(cardId::startsWith) -> TwinCardNumber.Second - else -> null - } + fun getTwinCardNumber(cardId: String): TwinCardNumber? = when { + firstCardSeries.any(cardId::startsWith) -> TwinCardNumber.First + secondCardSeries.any(cardId::startsWith) -> TwinCardNumber.Second + else -> null + } - fun getPairCardSeries(cardId: String): String? { - return when (getTwinCardNumber(cardId) ?: return null) { - TwinCardNumber.First -> { - val index = firstCardSeries.indexOf(cardId.take(4)) - secondCardSeries[index] - } - TwinCardNumber.Second -> { - val index = secondCardSeries.indexOf(cardId.take(4)) - firstCardSeries[index] - } - } - } + @Suppress("MagicNumber") + fun getTwinCardIdForUser(cardId: String): String { + if (cardId.length < 16) return cardId - fun getTwinCardIdForUser(cardId: String): String { - if (cardId.length < 16) return cardId - - val twinCardId = cardId.substring(11..14) - val twinCardNumber = getTwinCardNumber(cardId)?.number ?: 1 - return "$twinCardId #$twinCardNumber" - } - - private val firstCardSeries = listOf("CB61", "CB64") - private val secondCardSeries = listOf("CB62", "CB65") + val twinCardId = cardId.substring(11..14) + val twinCardNumber = getTwinCardNumber(cardId)?.number ?: 1 + return "$twinCardId #$twinCardNumber" } } diff --git a/domain/src/main/java/com/tangem/domain/common/extensions/Blockchain.kt b/domain/src/main/java/com/tangem/domain/common/extensions/Blockchain.kt index c684dbe3f5..f8bb58f3f1 100644 --- a/domain/src/main/java/com/tangem/domain/common/extensions/Blockchain.kt +++ b/domain/src/main/java/com/tangem/domain/common/extensions/Blockchain.kt @@ -2,6 +2,7 @@ package com.tangem.domain.common.extensions import com.tangem.blockchain.common.Blockchain +@Suppress("ComplexMethod") fun Blockchain.Companion.fromNetworkId(networkId: String): Blockchain? { return when (networkId) { "arbitrum-one" -> Blockchain.Arbitrum @@ -52,6 +53,7 @@ fun Blockchain.Companion.fromNetworkId(networkId: String): Blockchain? { } } +@Suppress("ComplexMethod") fun Blockchain.toNetworkId(): String { return when (this) { Blockchain.Unknown -> "unknown" @@ -103,6 +105,7 @@ fun Blockchain.toNetworkId(): String { } } +@Suppress("ComplexMethod") fun Blockchain.toCoinId(): String { return when (this) { Blockchain.Binance, Blockchain.BinanceTestnet, Blockchain.BSC, Blockchain.BSCTestnet -> "binancecoin" diff --git a/domain/src/main/java/com/tangem/domain/common/form/FieldDataConverters.kt b/domain/src/main/java/com/tangem/domain/common/form/FieldDataConverters.kt index a0cd94a04f..f4800c7223 100644 --- a/domain/src/main/java/com/tangem/domain/common/form/FieldDataConverters.kt +++ b/domain/src/main/java/com/tangem/domain/common/form/FieldDataConverters.kt @@ -12,7 +12,7 @@ interface DataConverterVisitor { interface FieldDataConverter : DataConverterVisitor -abstract class BaseFieldDataConverter() : FieldDataConverter { +abstract class BaseFieldDataConverter : FieldDataConverter { protected val collectIds: List get() = getIdToCollect() @@ -31,7 +31,7 @@ abstract class BaseFieldDataConverter() : FieldDataConverter { class FieldToJsonConverter( private val fieldsToConvert: List = listOf(), - protected val jsonConverter: MoshiJsonConverter + protected val jsonConverter: MoshiJsonConverter, ) : BaseFieldDataConverter() { override fun getConvertedData(): String = jsonConverter.toJson(collectedData, " ") diff --git a/domain/src/main/java/com/tangem/domain/common/form/FieldsValidators.kt b/domain/src/main/java/com/tangem/domain/common/form/FieldsValidators.kt index 53147c46b8..8f5e7dfd00 100644 --- a/domain/src/main/java/com/tangem/domain/common/form/FieldsValidators.kt +++ b/domain/src/main/java/com/tangem/domain/common/form/FieldsValidators.kt @@ -13,26 +13,34 @@ import timber.log.Timber /** [REDACTED_AUTHOR] */ -abstract class CustomTokenValidator : Validator +interface CustomTokenValidator : Validator -class StringIsEmptyValidator : CustomTokenValidator() { +class StringIsEmptyValidator : CustomTokenValidator { override fun validate(data: String?): AddCustomTokenError? = when { data == null || data.isEmpty() -> null else -> AddCustomTokenError.FieldIsNotEmpty } } -class StringIsNotEmptyValidator : CustomTokenValidator() { +class StringIsNotEmptyValidator : CustomTokenValidator { override fun validate(data: String?): AddCustomTokenError? = when { data == null || data.isEmpty() -> AddCustomTokenError.FieldIsEmpty else -> null } } -class TokenContractAddressValidator : CustomTokenValidator() { +class TokenContractAddressValidator : CustomTokenValidator { private var blockchain: Blockchain = Blockchain.Unknown + private val successAddressValidator = object : AddressService() { + override fun makeAddress(walletPublicKey: ByteArray, curve: EllipticCurve?): String { + throw UnsupportedOperationException() + } + + override fun validate(address: String): Boolean = true + } + fun nextValidationFor(blockchain: Blockchain) { this.blockchain = blockchain } @@ -63,32 +71,25 @@ class TokenContractAddressValidator : CustomTokenValidator() { } } } - - private val successAddressValidator = object : AddressService() { - override fun makeAddress(walletPublicKey: ByteArray, curve: EllipticCurve?): String { - throw UnsupportedOperationException() - } - - override fun validate(address: String): Boolean = true - } } -class TokenNetworkValidator : CustomTokenValidator() { +class TokenNetworkValidator : CustomTokenValidator { override fun validate(data: Blockchain?): AddCustomTokenError? = when (data) { null, Blockchain.Unknown -> AddCustomTokenError.NetworkIsNotSelected else -> null } } -class TokenNameValidator : CustomTokenValidator() { +class TokenNameValidator : CustomTokenValidator { override fun validate(data: String?): AddCustomTokenError? = StringIsNotEmptyValidator().validate(data) } -class TokenSymbolValidator : CustomTokenValidator() { +class TokenSymbolValidator : CustomTokenValidator { override fun validate(data: String?): AddCustomTokenError? = StringIsNotEmptyValidator().validate(data) } -class TokenDecimalsValidator : CustomTokenValidator() { +@Suppress("MagicNumber") +class TokenDecimalsValidator : CustomTokenValidator { override fun validate(data: String?): AddCustomTokenError? { val decimal = data?.toIntOrNull() ?: return AddCustomTokenError.FieldIsEmpty diff --git a/domain/src/main/java/com/tangem/domain/common/util/UserWalletId.kt b/domain/src/main/java/com/tangem/domain/common/util/UserWalletId.kt index abf878da69..17c22839fd 100644 --- a/domain/src/main/java/com/tangem/domain/common/util/UserWalletId.kt +++ b/domain/src/main/java/com/tangem/domain/common/util/UserWalletId.kt @@ -25,6 +25,7 @@ class UserWalletId( return stringValue.hashCode() } + @Suppress("MagicNumber") override fun toString(): String { return with(stringValue) { "UserWalletId(${take(3)}...${takeLast(3)})" diff --git a/domain/src/main/java/com/tangem/domain/common/util/ValueDebouncer.kt b/domain/src/main/java/com/tangem/domain/common/util/ValueDebouncer.kt index 919157a26c..4296bf4c3f 100644 --- a/domain/src/main/java/com/tangem/domain/common/util/ValueDebouncer.kt +++ b/domain/src/main/java/com/tangem/domain/common/util/ValueDebouncer.kt @@ -9,6 +9,7 @@ import kotlinx.coroutines.flow.onEach /** [REDACTED_AUTHOR] */ +@Suppress("MagicNumber") class ValueDebouncer( private val initialValue: T, private val debounceDuration: Long = 400, diff --git a/domain/src/main/java/com/tangem/domain/features/addCustomToken/AddCustomTokenService.kt b/domain/src/main/java/com/tangem/domain/features/addCustomToken/AddCustomTokenService.kt index 8015e7fc84..2296da1914 100644 --- a/domain/src/main/java/com/tangem/domain/features/addCustomToken/AddCustomTokenService.kt +++ b/domain/src/main/java/com/tangem/domain/features/addCustomToken/AddCustomTokenService.kt @@ -48,7 +48,7 @@ class AddCustomTokenService( return@withContext emptyList() } - throw IllegalStateException("Unreachable code because runCatching must return result") + error("Unreachable code because runCatching must return result") } private fun selectNetworksForSearch(networkId: String?): String { diff --git a/domain/src/main/java/com/tangem/domain/features/addCustomToken/CustomCurrency.kt b/domain/src/main/java/com/tangem/domain/features/addCustomToken/CustomCurrency.kt index a09d2f3907..fd1a47b728 100644 --- a/domain/src/main/java/com/tangem/domain/features/addCustomToken/CustomCurrency.kt +++ b/domain/src/main/java/com/tangem/domain/features/addCustomToken/CustomCurrency.kt @@ -18,11 +18,11 @@ sealed class CustomCurrency( class CustomBlockchain( network: Blockchain, - derivationPath: DerivationPath? + derivationPath: DerivationPath?, ) : CustomCurrency(network, derivationPath) { class Converter( - private val derivationStyle: DerivationStyle? + private val derivationStyle: DerivationStyle?, ) : BaseFieldDataConverter() { override fun getConvertedData(): CustomBlockchain { val mainNetwork = collectedData[CustomTokenFieldId.Network] as Blockchain @@ -30,24 +30,25 @@ sealed class CustomCurrency( val derivationPath = AddCustomTokenState.getDerivationPath( mainNetwork, derivationPathNetwork, - derivationStyle + derivationStyle, ) return CustomBlockchain(mainNetwork, derivationPath) } - override fun getIdToCollect(): List = listOf(CustomTokenFieldId.Network, CustomTokenFieldId.DerivationPath) + override fun getIdToCollect(): List = + listOf(CustomTokenFieldId.Network, CustomTokenFieldId.DerivationPath) } } class CustomToken( val token: Token, network: Blockchain, - derivationPath: DerivationPath? + derivationPath: DerivationPath?, ) : CustomCurrency(network, derivationPath) { class Converter( private val tokenId: String?, - private val derivationStyle: DerivationStyle? + private val derivationStyle: DerivationStyle?, ) : BaseFieldDataConverter() { override fun getConvertedData(): CustomToken { @@ -56,7 +57,7 @@ sealed class CustomCurrency( val derivationPath = AddCustomTokenState.getDerivationPath( mainNetwork, derivationPathNetwork, - derivationStyle + derivationStyle, ) val token = Token( diff --git a/domain/src/main/java/com/tangem/domain/features/addCustomToken/redux/AddCustomTokenAction.kt b/domain/src/main/java/com/tangem/domain/features/addCustomToken/redux/AddCustomTokenAction.kt index cc41cdb3d4..c2ae9ff018 100644 --- a/domain/src/main/java/com/tangem/domain/features/addCustomToken/redux/AddCustomTokenAction.kt +++ b/domain/src/main/java/com/tangem/domain/features/addCustomToken/redux/AddCustomTokenAction.kt @@ -31,7 +31,10 @@ sealed class AddCustomTokenAction : Action { data class OnTokenNetworkChanged(val blockchainNetwork: Field.Data) : AddCustomTokenAction() data class OnTokenNameChanged(val tokenName: Field.Data) : AddCustomTokenAction() data class OnTokenSymbolChanged(val tokenSymbol: Field.Data) : AddCustomTokenAction() - data class OnTokenDerivationPathChanged(val blockchainDerivationPath: Field.Data) : AddCustomTokenAction() + data class OnTokenDerivationPathChanged( + val blockchainDerivationPath: Field.Data, + ) : AddCustomTokenAction() + data class OnTokenDecimalsChanged(val tokenDecimals: Field.Data) : AddCustomTokenAction() object OnAddCustomTokenClicked : AddCustomTokenAction() @@ -51,7 +54,7 @@ sealed class AddCustomTokenAction : Action { data class Remove(val warnings: Set) : Warning() data class Replace( val remove: Set, - val add: Set + val add: Set, ) : Warning() } diff --git a/domain/src/main/java/com/tangem/domain/features/addCustomToken/redux/AddCustomTokenHub.kt b/domain/src/main/java/com/tangem/domain/features/addCustomToken/redux/AddCustomTokenHub.kt index b0ffab36b3..080b0b2601 100644 --- a/domain/src/main/java/com/tangem/domain/features/addCustomToken/redux/AddCustomTokenHub.kt +++ b/domain/src/main/java/com/tangem/domain/features/addCustomToken/redux/AddCustomTokenHub.kt @@ -66,6 +66,7 @@ import timber.log.Timber /** [REDACTED_AUTHOR] */ +@Suppress("LargeClass") internal class AddCustomTokenHub : BaseStoreHub("AddCustomTokenHub") { private val hubState: AddCustomTokenState @@ -79,10 +80,11 @@ internal class AddCustomTokenHub : BaseStoreHub("AddCustomT return storeState.copy(addCustomTokensState = newHubState) } + @Suppress("ComplexMethod") override suspend fun handleAction( action: Action, storeState: DomainState, - cancel: ValueCallback + cancel: ValueCallback, ) { if (action !is AddCustomTokenAction) return @@ -225,7 +227,7 @@ internal class AddCustomTokenHub : BaseStoreHub("AddCustomT val derivationField = DerivationPath.getField() derivationField.data = derivationField.data.copy( value = Blockchain.Unknown, - isUserInput = false + isUserInput = false, ) state.setField(derivationField) dispatchOnMain(UpdateForm(hubState)) @@ -344,6 +346,7 @@ internal class AddCustomTokenHub : BaseStoreHub("AddCustomT } } + @Suppress("MagicNumber") private suspend fun requestInfoAboutToken(contractAddress: String): List { val tangemTechServiceManager = requireNotNull(hubState.tangemTechServiceManager) dispatchOnMain(Screen.UpdateTokenFields(listOf(ContractAddress to ViewStates.TokenField(isLoading = true)))) @@ -375,7 +378,7 @@ internal class AddCustomTokenHub : BaseStoreHub("AddCustomT tokenId: String? = hubState.foundToken?.id, tokenContractAddress: String = ContractAddress.getFieldValue(), tokenNetworkId: String = Network.getFieldValue().toNetworkId(), - selectedDerivation: Blockchain = DerivationPath.getFieldValue() + selectedDerivation: Blockchain = DerivationPath.getFieldValue(), ): Boolean { val savedCurrencies = hubState.appSavedCurrencies ?: return false @@ -388,6 +391,7 @@ internal class AddCustomTokenHub : BaseStoreHub("AddCustomT val sameAddress = tokenContractAddress == wrappedCurrency.token.contractAddress val sameBlockchain = Blockchain.fromNetworkId(tokenNetworkId) == wrappedCurrency.blockchain val sameDerivationPath = derivationPath?.rawPath == wrappedCurrency.derivationPath + @Suppress("ComplexCondition") if (sameId && sameAddress && sameBlockchain && sameDerivationPath) { return true } @@ -399,7 +403,7 @@ internal class AddCustomTokenHub : BaseStoreHub("AddCustomT private fun isBlockchainPersistIntoAppSavedTokensList( selectedNetwork: Blockchain = Network.getFieldValue(), - selectedDerivation: Blockchain = DerivationPath.getFieldValue() + selectedDerivation: Blockchain = DerivationPath.getFieldValue(), ): Boolean { val state = hubState val savedCurrencies = state.appSavedCurrencies ?: return false @@ -419,11 +423,11 @@ internal class AddCustomTokenHub : BaseStoreHub("AddCustomT } private fun getDerivationPathFromSelectedBlockchain( - selectedDerivationBlockchain: Blockchain + selectedDerivationBlockchain: Blockchain, ): com.tangem.common.hdWallet.DerivationPath? = AddCustomTokenState.getDerivationPath( mainNetwork = Network.getFieldValue(), derivationNetwork = selectedDerivationBlockchain, - derivationStyle = hubState.cardDerivationStyle + derivationStyle = hubState.cardDerivationStyle, ) private suspend fun fillTokenFields(token: CoinsResponse.Coin, coinNetwork: CoinsResponse.Coin.Network) { @@ -482,7 +486,7 @@ internal class AddCustomTokenHub : BaseStoreHub("AddCustomT @Throws private fun throwUnAppropriateInitialization(objName: String) { throw AddCustomTokenError.UnAppropriateInitialization( - "AddCustomTokenHub", "$objName must be not NULL" + "AddCustomTokenHub", "$objName must be not NULL", ) } @@ -567,16 +571,14 @@ internal class AddCustomTokenHub : BaseStoreHub("AddCustomT private suspend fun AddCustomTokenError.Warning.remove() { dispatchOnMain(Warning.Remove(setOf(this))) } - - private suspend fun AddCustomTokenError.Warning.replaceBy(to: AddCustomTokenError.Warning) { - dispatchOnMain(Warning.Replace(setOf(this), setOf(to))) - } } +@Suppress("ComplexMethod") private class AddCustomTokenReducer( private val globalState: DomainGlobalState, ) : ReStoreReducer { + @Suppress("LongMethod") override fun reduceAction(action: Action, state: AddCustomTokenState): AddCustomTokenState { return when (action) { is Init.SetAddedCurrencies -> { diff --git a/domain/src/main/java/com/tangem/domain/features/addCustomToken/redux/AddCustomTokenState.kt b/domain/src/main/java/com/tangem/domain/features/addCustomToken/redux/AddCustomTokenState.kt index ad0be88966..8a722f7e52 100644 --- a/domain/src/main/java/com/tangem/domain/features/addCustomToken/redux/AddCustomTokenState.kt +++ b/domain/src/main/java/com/tangem/domain/features/addCustomToken/redux/AddCustomTokenState.kt @@ -265,7 +265,7 @@ data class AddCustomTokenState( private var builder: StringBuilder = StringBuilder() override fun convert(action: Action, stateHolder: DomainState): String? { - val action = (action as? AddCustomTokenAction) ?: return null + val action = action as? AddCustomTokenAction ?: return null val state = stateHolder.addCustomTokensState val fieldConverter = diff --git a/domain/src/main/java/com/tangem/domain/redux/DomainStore.kt b/domain/src/main/java/com/tangem/domain/redux/DomainStore.kt index 703ca18a88..8d849a2e82 100644 --- a/domain/src/main/java/com/tangem/domain/redux/DomainStore.kt +++ b/domain/src/main/java/com/tangem/domain/redux/DomainStore.kt @@ -9,8 +9,6 @@ import org.rekotlin.Store /** [REDACTED_AUTHOR] */ -private class DomainStore // for simple search - private val RE_STORE_HUBS: List> = listOf( DomainGlobalHub(), AddCustomTokenHub(), @@ -19,7 +17,7 @@ private val RE_STORE_HUBS: List> = listOf( val domainStore = Store( state = DomainState(), middleware = RE_STORE_HUBS.map { it.getMiddleware() }, - reducer = { action, state -> reduce(action, state) } + reducer = { action, state -> reduce(action, state) }, ) private fun reduce(action: Action, domainState: DomainState?): DomainState { diff --git a/features/referral/presentation/src/main/java/com/tangem/feature/referral/ui/ParticipateBottomBlock.kt b/features/referral/presentation/src/main/java/com/tangem/feature/referral/ui/ParticipateBottomBlock.kt index 5f483b473a..5d32a2adc4 100644 --- a/features/referral/presentation/src/main/java/com/tangem/feature/referral/ui/ParticipateBottomBlock.kt +++ b/features/referral/presentation/src/main/java/com/tangem/feature/referral/ui/ParticipateBottomBlock.kt @@ -29,6 +29,7 @@ import com.tangem.core.ui.components.SmallInfoCard import com.tangem.core.ui.res.TangemTheme import com.tangem.feature.referral.presentation.R +@Suppress("LongParameterList") @OptIn(ExperimentalComposeUiApi::class) @Composable internal fun ParticipateBottomBlock( diff --git a/features/referral/presentation/src/main/java/com/tangem/feature/referral/viewmodels/ReferralViewModel.kt b/features/referral/presentation/src/main/java/com/tangem/feature/referral/viewmodels/ReferralViewModel.kt index cd1f8795b7..2432d8c1e0 100644 --- a/features/referral/presentation/src/main/java/com/tangem/feature/referral/viewmodels/ReferralViewModel.kt +++ b/features/referral/presentation/src/main/java/com/tangem/feature/referral/viewmodels/ReferralViewModel.kt @@ -123,6 +123,7 @@ internal class ReferralViewModel @Inject constructor( private fun ReferralData.getNetworkName(): String = getToken().networkId.replaceFirstChar(Char::uppercase) + @Suppress("MagicNumber") private fun ReferralInfo.getAddressValue(): String { check(address.length > 5) { "Invalid address" } return address.substring(startIndex = 0, endIndex = 4) + "..." + diff --git a/features/swap/data/src/main/java/com/tangem/feature/swap/SwapRepositoryImpl.kt b/features/swap/data/src/main/java/com/tangem/feature/swap/SwapRepositoryImpl.kt index cdcc527c0e..f7ec74b40b 100644 --- a/features/swap/data/src/main/java/com/tangem/feature/swap/SwapRepositoryImpl.kt +++ b/features/swap/data/src/main/java/com/tangem/feature/swap/SwapRepositoryImpl.kt @@ -20,6 +20,7 @@ import com.tangem.utils.coroutines.CoroutineDispatcherProvider import kotlinx.coroutines.withContext import javax.inject.Inject +@Suppress("LongParameterList") internal class SwapRepositoryImpl @Inject constructor( private val tangemTechApi: TangemTechApi, private val oneInchApiFactory: OneInchApiFactory, diff --git a/features/swap/domain/src/main/java/com/tangem/feature/swap/domain/SwapInteractorImpl.kt b/features/swap/domain/src/main/java/com/tangem/feature/swap/domain/SwapInteractorImpl.kt index f49cafea71..0bfe04ae49 100644 --- a/features/swap/domain/src/main/java/com/tangem/feature/swap/domain/SwapInteractorImpl.kt +++ b/features/swap/domain/src/main/java/com/tangem/feature/swap/domain/SwapInteractorImpl.kt @@ -25,6 +25,7 @@ import com.tangem.utils.toFormattedString import java.math.BigDecimal import javax.inject.Inject +@Suppress("LargeClass") internal class SwapInteractorImpl @Inject constructor( private val transactionManager: TransactionManager, private val userWalletManager: UserWalletManager, @@ -120,8 +121,9 @@ internal class SwapInteractorImpl @Inject constructor( "estimatedGas not found call findBestQuote" }, ) - val transactionData = - requireNotNull(cache.getApproveTransactionData()) { "getApproveTransactionData not found, call findQuotes" } + val transactionData = requireNotNull(cache.getApproveTransactionData()) { + "getApproveTransactionData not found, call findQuotes" + } val gasPrice = transactionData.gasPrice.toBigDecimalOrNull() ?: error("cannot parse gasPrice") val fee = transactionManager.calculateFee(networkId, gasPrice.toPlainString(), estimatedGas) val result = transactionManager.sendTransaction( @@ -272,6 +274,7 @@ internal class SwapInteractorImpl @Inject constructor( /** * Load quote data calls only if spend is not allowed for token contract address */ + @Suppress("LongParameterList") private suspend fun loadQuoteData( networkId: String, fromTokenAddress: String, @@ -321,6 +324,7 @@ internal class SwapInteractorImpl @Inject constructor( /** * Load swap data calls only if spend is allowed for token contract address */ + @Suppress("LongParameterList") private suspend fun loadSwapData( networkId: String, fromTokenAddress: String, @@ -362,6 +366,7 @@ internal class SwapInteractorImpl @Inject constructor( } } + @Suppress("LongParameterList") private suspend fun updateBalances( networkId: String, fromToken: Currency, @@ -448,6 +453,7 @@ internal class SwapInteractorImpl @Inject constructor( } } + @Suppress("MagicNumber") private fun increaseByPercents(percents: Int, value: Int): Int { return value * (percents / 100 + 1) } diff --git a/features/swap/domain/src/main/java/com/tangem/feature/swap/domain/SwapRepository.kt b/features/swap/domain/src/main/java/com/tangem/feature/swap/domain/SwapRepository.kt index f7a2c78934..1f882537f6 100644 --- a/features/swap/domain/src/main/java/com/tangem/feature/swap/domain/SwapRepository.kt +++ b/features/swap/domain/src/main/java/com/tangem/feature/swap/domain/SwapRepository.kt @@ -52,6 +52,7 @@ interface SwapRepository { walletAddress: String, ): AggregatedSwapDataModel + @Suppress("LongParameterList") suspend fun prepareSwapTransaction( networkId: String, fromTokenAddress: String, diff --git a/features/swap/presentation/src/main/java/com/tangem/feature/swap/ui/SwapScreenContent.kt b/features/swap/presentation/src/main/java/com/tangem/feature/swap/ui/SwapScreenContent.kt index a75d723ff7..9dad0f4277 100644 --- a/features/swap/presentation/src/main/java/com/tangem/feature/swap/ui/SwapScreenContent.kt +++ b/features/swap/presentation/src/main/java/com/tangem/feature/swap/ui/SwapScreenContent.kt @@ -49,6 +49,7 @@ import com.tangem.feature.swap.models.SwapWarning import com.tangem.feature.swap.models.TransactionCardType import com.tangem.feature.swap.presentation.R +@Suppress("LongMethod") @Composable internal fun SwapScreenContent( modifier: Modifier = Modifier, @@ -170,7 +171,11 @@ private fun MainInfo(state: SwapStateHolder) { tokenIconUrl = state.receiveCardData.tokenIconUrl, tokenCurrency = state.receiveCardData.tokenCurrency, networkIconRes = state.receiveCardData.networkIconRes, - onChangeTokenClick = if (state.receiveCardData.canSelectAnotherToken) state.onSelectTokenClick else null, + onChangeTokenClick = if (state.receiveCardData.canSelectAnotherToken) { + state.onSelectTokenClick + } else { + null + }, ) } Card( diff --git a/features/swap/presentation/src/main/java/com/tangem/feature/swap/ui/SwapSelectTokenScreen.kt b/features/swap/presentation/src/main/java/com/tangem/feature/swap/ui/SwapSelectTokenScreen.kt index 2b2ad1c321..19d8aa0a0a 100644 --- a/features/swap/presentation/src/main/java/com/tangem/feature/swap/ui/SwapSelectTokenScreen.kt +++ b/features/swap/presentation/src/main/java/com/tangem/feature/swap/ui/SwapSelectTokenScreen.kt @@ -74,19 +74,18 @@ private fun ListOfTokens(state: SwapSelectTokenStateHolder, modifier: Modifier = itemsIndexed(items = state.tokens) { index, item -> TokenItem(token = item, onTokenClick = { state.onTokenSelected(item.id) }) - if (index != state.tokens.lastIndex) Divider( - color = TangemTheme.colors.stroke.primary, - startIndent = TangemTheme.dimens.spacing54, - ) + if (index != state.tokens.lastIndex) { + Divider( + color = TangemTheme.colors.stroke.primary, + startIndent = TangemTheme.dimens.spacing54, + ) + } } } } @Composable -private fun TokenItem( - token: TokenToSelect, - onTokenClick: (String) -> Unit, -) { +private fun TokenItem(token: TokenToSelect, onTokenClick: (String) -> Unit) { Row( modifier = Modifier .fillMaxWidth() @@ -95,18 +94,12 @@ private fun TokenItem( bottom = TangemTheme.dimens.spacing14, end = TangemTheme.dimens.spacing16, ) - .clickable( - onClick = { onTokenClick(token.id) }, - ), + .clickable { onTokenClick(token.id) }, verticalAlignment = Alignment.CenterVertically, ) { - TokenIcon(token = token) - Column( - modifier = Modifier - .align(Alignment.CenterVertically), - ) { + Column(modifier = Modifier.align(Alignment.CenterVertically)) { Text( text = token.name, style = TangemTheme.typography.subtitle1, @@ -126,7 +119,6 @@ private fun TokenItem( Spacer(modifier = Modifier.weight(1f)) - if (!token.available) { Text( text = stringResource(id = R.string.swapping_token_not_available), @@ -137,8 +129,7 @@ private fun TokenItem( Column( horizontalAlignment = Alignment.End, verticalArrangement = Arrangement.Center, - modifier = Modifier - .padding(start = TangemTheme.dimens.spacing8), + modifier = Modifier.padding(start = TangemTheme.dimens.spacing8), ) { Text( text = token.addedTokenBalanceData.amount ?: "", @@ -153,10 +144,10 @@ private fun TokenItem( ) } } - } } +@Suppress("MagicNumber") @Composable private fun TokenIcon(token: TokenToSelect) { Box( diff --git a/features/swap/presentation/src/main/java/com/tangem/feature/swap/ui/TransactionCard.kt b/features/swap/presentation/src/main/java/com/tangem/feature/swap/ui/TransactionCard.kt index c5a0edeca4..daaa05fc22 100644 --- a/features/swap/presentation/src/main/java/com/tangem/feature/swap/ui/TransactionCard.kt +++ b/features/swap/presentation/src/main/java/com/tangem/feature/swap/ui/TransactionCard.kt @@ -60,6 +60,7 @@ import com.tangem.core.ui.res.TangemTheme import com.tangem.feature.swap.models.TransactionCardType import com.valentinilk.shimmer.shimmer +@Suppress("LongParameterList") @Composable fun TransactionCard( modifier: Modifier = Modifier, @@ -159,6 +160,7 @@ private fun Header( } } +@Suppress("LongMethod") @Composable private fun Content( type: TransactionCardType, @@ -243,6 +245,7 @@ private fun Content( } } +@Suppress("MagicNumber") @Composable private fun AutoSizeTextField( amount: String, @@ -302,6 +305,7 @@ private fun AutoSizeTextField( } } +@Suppress("MagicNumber") @Composable fun Token( tokenIconUrl: String, @@ -320,9 +324,7 @@ fun Token( Box( modifier = Modifier - .padding( - end = TangemTheme.dimens.spacing16, - ) + .padding(end = TangemTheme.dimens.spacing16) .size(TangemTheme.dimens.size42), ) { val tokenImageModifier = Modifier @@ -345,14 +347,11 @@ fun Token( modifier = Modifier .align(Alignment.TopEnd) .size(TangemTheme.dimens.size18) - .background( - color = Color.White, - shape = CircleShape, - ), + .background(color = Color.White, shape = CircleShape), contentAlignment = Alignment.Center, ) { Image( - modifier = Modifier.padding(all = (0.5).dp), + modifier = Modifier.padding(all = 0.5.dp), painter = painterResource(id = networkIconRes), contentDescription = null, ) @@ -368,8 +367,7 @@ fun Token( maxLines = 1, style = TangemTheme.typography.subtitle2, textAlign = TextAlign.Center, - modifier = Modifier - .defaultMinSize(minWidth = TangemTheme.dimens.size80), + modifier = Modifier.defaultMinSize(minWidth = TangemTheme.dimens.size80), ) } } diff --git a/libs/crypto/src/main/java/com/tangem/lib/crypto/TransactionManager.kt b/libs/crypto/src/main/java/com/tangem/lib/crypto/TransactionManager.kt index ca92f3faf6..712634f1fb 100644 --- a/libs/crypto/src/main/java/com/tangem/lib/crypto/TransactionManager.kt +++ b/libs/crypto/src/main/java/com/tangem/lib/crypto/TransactionManager.kt @@ -7,6 +7,7 @@ import java.math.BigDecimal interface TransactionManager { + @Suppress("LongParameterList") @Throws(IllegalStateException::class) suspend fun sendTransaction( networkId: String,