diff --git a/app/src/main/java/com/tangem/tap/common/extensions/Collections.kt b/app/src/main/java/com/tangem/tap/common/extensions/Collections.kt index 517d8ca5ed..ee2867d25c 100644 --- a/app/src/main/java/com/tangem/tap/common/extensions/Collections.kt +++ b/app/src/main/java/com/tangem/tap/common/extensions/Collections.kt @@ -1,15 +1,5 @@ package com.tangem.tap.common.extensions -/** -[REDACTED_AUTHOR] - */ -fun List.containsAny(list: List): Boolean { - this.forEach { mainItem -> - list.forEach { if (it == mainItem) return true } - } - return false -} - fun MutableList.removeBy(predicate: (T) -> Boolean): Boolean { val toRemove = this.filter(predicate) this.removeAll(toRemove) 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 9d908f0724..b5122147ca 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 @@ -1,16 +1,16 @@ package com.tangem.tap.domain.configurable.warningMessage import com.tangem.blockchain.common.Blockchain -import com.tangem.tap.common.extensions.containsAny import com.tangem.tap.common.extensions.removeBy import com.tangem.wallet.R +import java.util.concurrent.CopyOnWriteArrayList /** [REDACTED_AUTHOR] */ class WarningMessagesManager { - private val warningsList: MutableList = mutableListOf() + private val warningsList = CopyOnWriteArrayList() fun addWarning(warning: WarningMessage) { if (findWarning(warning) == null) { @@ -19,36 +19,27 @@ class WarningMessagesManager { } } - fun getWarnings( - location: WarningMessage.Location, - forBlockchains: List = emptyList(), - ): List { - return warningsList - .filter { !it.isHidden && it.location.contains(location) } - .filter { - val list = it.blockchainList - when { - list == null -> true - list.containsAny(forBlockchains) -> true - else -> false - } - } + fun getWarnings(location: WarningMessage.Location, blockchains: List): List { + return warningsList.filter { message -> + val messageBlockchains = message.blockchainList + val isCorrespondingMessageBlockchains = messageBlockchains == null || + messageBlockchains.any(blockchains::contains) + val isCorrespondingMessageLocation = message.location.contains(location) + + !message.isHidden && isCorrespondingMessageLocation && isCorrespondingMessageBlockchains + } } fun hideWarning(warning: WarningMessage): Boolean { - val foundWarning = findWarning(warning) - return when { - foundWarning == null -> false - foundWarning.type == WarningMessage.Type.Temporary || - foundWarning.type == WarningMessage.Type.AppRating -> { - if (foundWarning.isHidden) { - false - } else { - foundWarning.isHidden = true - true - } - } - else -> false + val foundWarning = findWarning(warning) ?: return false + val isCorrectType = foundWarning.type == WarningMessage.Type.Temporary || + foundWarning.type == WarningMessage.Type.AppRating + + return if (!foundWarning.isHidden && isCorrectType) { + foundWarning.isHidden = true + true + } else { + false } } @@ -72,31 +63,31 @@ class WarningMessagesManager { companion object { const val REMAINING_SIGNATURES_WARNING = 10 - fun devCardWarning(): WarningMessage = WarningMessage( - "", - "", + val devCardWarning = WarningMessage( + title = "", + message = "", type = WarningMessage.Type.Permanent, priority = WarningMessage.Priority.Critical, - listOf(WarningMessage.Location.MainScreen), - null, - R.string.common_warning, - R.string.alert_developer_card, - WarningMessage.Origin.Local, + location = listOf(WarningMessage.Location.MainScreen), + blockchains = null, + titleResId = R.string.common_warning, + messageResId = R.string.alert_developer_card, + origin = WarningMessage.Origin.Local, ) - fun alreadySignedHashesWarning(): WarningMessage = WarningMessage( - "", - "", + val alreadySignedHashesWarning = WarningMessage( + title = "", + message = "", type = WarningMessage.Type.Temporary, priority = WarningMessage.Priority.Info, - listOf(WarningMessage.Location.MainScreen), - null, - R.string.common_warning, - R.string.alert_card_signed_transactions, - WarningMessage.Origin.Local, + location = listOf(WarningMessage.Location.MainScreen), + blockchains = null, + titleResId = R.string.common_warning, + messageResId = R.string.alert_card_signed_transactions, + origin = WarningMessage.Origin.Local, ) - fun signedHashesMultiWalletWarning(): WarningMessage = WarningMessage( + val signedHashesMultiWalletWarning = WarningMessage( title = "", message = "", type = WarningMessage.Type.Temporary, @@ -110,69 +101,71 @@ class WarningMessagesManager { titleFormatArg = "\u26A0", ) - fun appRatingWarning(): WarningMessage = WarningMessage( - "", - "", - WarningMessage.Type.AppRating, - WarningMessage.Priority.Info, - listOf(WarningMessage.Location.MainScreen), - null, - R.string.warning_rate_app_title, - R.string.warning_rate_app_message, - WarningMessage.Origin.Local, + val appRatingWarning = WarningMessage( + title = "", + message = "", + type = WarningMessage.Type.AppRating, + priority = WarningMessage.Priority.Info, + location = listOf(WarningMessage.Location.MainScreen), + blockchains = null, + titleResId = R.string.warning_rate_app_title, + messageResId = R.string.warning_rate_app_message, + origin = WarningMessage.Origin.Local, ) - fun isAlreadySignedHashesWarning(warning: WarningMessage): Boolean { - return warning.messageResId == R.string.alert_card_signed_transactions - } - - fun onlineVerificationFailed(): WarningMessage = WarningMessage( - "", - "", - type = WarningMessage.Type.Permanent, - priority = WarningMessage.Priority.Critical, - listOf(WarningMessage.Location.MainScreen), - null, - R.string.warning_failed_to_verify_card_title, - R.string.warning_failed_to_verify_card_message, - WarningMessage.Origin.Local, - ) - - fun remainingSignaturesNotEnough(remainingSignatures: Int): WarningMessage = WarningMessage( + val onlineVerificationFailed = WarningMessage( title = "", message = "", type = WarningMessage.Type.Permanent, priority = WarningMessage.Priority.Critical, - listOf(WarningMessage.Location.MainScreen), + location = listOf(WarningMessage.Location.MainScreen), blockchains = null, - titleResId = R.string.common_warning, - messageResId = R.string.warning_low_signatures_format, + titleResId = R.string.warning_failed_to_verify_card_title, + messageResId = R.string.warning_failed_to_verify_card_message, origin = WarningMessage.Origin.Local, - messageFormatArg = remainingSignatures.toString(), ) - fun testCardWarning(): WarningMessage = WarningMessage( - "", - "", + val testCardWarning = WarningMessage( + title = "", + message = "", type = WarningMessage.Type.TestCard, priority = WarningMessage.Priority.Critical, - listOf(WarningMessage.Location.MainScreen, WarningMessage.Location.SendScreen), - null, - R.string.common_warning, - R.string.warning_testnet_card_message, - WarningMessage.Origin.Local, + location = listOf(WarningMessage.Location.MainScreen, WarningMessage.Location.SendScreen), + blockchains = null, + titleResId = R.string.common_warning, + messageResId = R.string.warning_testnet_card_message, + origin = WarningMessage.Origin.Local, ) - fun demoCardWarning(): WarningMessage = WarningMessage( - "", - "", + val demoCardWarning = WarningMessage( + title = "", + message = "", type = WarningMessage.Type.Permanent, priority = WarningMessage.Priority.Critical, - listOf(WarningMessage.Location.MainScreen), - null, - R.string.common_warning, - R.string.alert_demo_message, - WarningMessage.Origin.Local, + location = listOf(WarningMessage.Location.MainScreen), + blockchains = null, + titleResId = R.string.common_warning, + messageResId = R.string.alert_demo_message, + origin = WarningMessage.Origin.Local, ) + + fun remainingSignaturesNotEnough(remainingSignatures: Int): WarningMessage { + return WarningMessage( + title = "", + message = "", + type = WarningMessage.Type.Permanent, + priority = WarningMessage.Priority.Critical, + location = listOf(WarningMessage.Location.MainScreen), + blockchains = null, + titleResId = R.string.common_warning, + messageResId = R.string.warning_low_signatures_format, + origin = WarningMessage.Origin.Local, + messageFormatArg = remainingSignatures.toString(), + ) + } + + fun isAlreadySignedHashesWarning(warning: WarningMessage): Boolean { + return warning.messageResId == R.string.alert_card_signed_transactions + } } } \ No newline at end of file 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 3ade28d8db..fa6759eb26 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 @@ -31,7 +31,7 @@ class WarningsMiddleware { is WalletAction.Warnings.CheckIfNeeded -> { showCardWarningsIfNeeded(globalState) val readyToShow = preferencesStorage.appRatingLaunchObserver.isReadyToShow() - if (readyToShow) addWarningMessage(WarningMessagesManager.appRatingWarning(), true) + if (readyToShow) addWarningMessage(warning = WarningMessagesManager.appRatingWarning, autoUpdate = true) } is WalletAction.Warnings.CheckHashesCount.CheckHashesCountOnline -> checkHashesCountOnline() is WalletAction.Warnings.CheckHashesCount.SaveCardId -> { @@ -69,7 +69,7 @@ class WarningsMiddleware { preferencesStorage.appRatingLaunchObserver.foundWalletWithFunds() } if (preferencesStorage.appRatingLaunchObserver.isReadyToShow()) { - addWarningMessage(WarningMessagesManager.appRatingWarning(), true) + addWarningMessage(WarningMessagesManager.appRatingWarning, true) } } @@ -78,21 +78,21 @@ class WarningsMiddleware { val card = scanResponse.card globalState.warningManager?.removeWarnings(WarningMessage.Origin.Local) if (card.isTestCard) { - addWarningMessage(WarningMessagesManager.testCardWarning(), autoUpdate = true) + addWarningMessage(WarningMessagesManager.testCardWarning, autoUpdate = true) return@let } showWarningLowRemainingSignaturesIfNeeded(card) if (card.firmwareVersion.type != FirmwareVersion.FirmwareType.Release) { - addWarningMessage(WarningMessagesManager.devCardWarning()) + addWarningMessage(WarningMessagesManager.devCardWarning) } else if (!preferencesStorage.usedCardsPrefStorage.wasScanned(card.cardId)) { checkIfWarningNeeded(scanResponse)?.let { warning -> addWarningMessage(warning) } } if (card.firmwareVersion.type == FirmwareVersion.FirmwareType.Release && !globalState.cardVerifiedOnline) { - addWarningMessage(WarningMessagesManager.onlineVerificationFailed()) + addWarningMessage(WarningMessagesManager.onlineVerificationFailed) } if (scanResponse.isDemoCard()) { - addWarningMessage(WarningMessagesManager.demoCardWarning()) + addWarningMessage(WarningMessagesManager.demoCardWarning) } setWarningMessages() } @@ -113,7 +113,7 @@ class WarningsMiddleware { if (scanResponse.cardTypesResolver.isMultiwalletAllowed()) { val isBackupForbidden = with(scanResponse.card.settings) { !(isBackupAllowed || isHDWalletAllowed) } return if (scanResponse.card.hasSignedHashes() && isBackupForbidden) { - WarningMessagesManager.signedHashesMultiWalletWarning() + WarningMessagesManager.signedHashesMultiWalletWarning } else { store.dispatch(WalletAction.Warnings.CheckHashesCount.SaveCardId) null @@ -123,7 +123,7 @@ class WarningsMiddleware { val validator = store.state.walletState.walletManagers.firstOrNull() as? SignatureCountValidator return if (validator == null) { if (scanResponse.card.hasSignedHashes()) { - WarningMessagesManager.alreadySignedHashesWarning() + WarningMessagesManager.alreadySignedHashesWarning } else { store.dispatch(WalletAction.Warnings.CheckHashesCount.SaveCardId) null @@ -161,9 +161,9 @@ class WarningsMiddleware { } is SimpleResult.Failure -> if (result.error is BlockchainSdkError.SignatureCountNotMatched) { - addWarningMessage(WarningMessagesManager.alreadySignedHashesWarning(), true) + addWarningMessage(WarningMessagesManager.alreadySignedHashesWarning, true) } else if (signedHashes > 0) { - addWarningMessage(WarningMessagesManager.alreadySignedHashesWarning(), true) + addWarningMessage(WarningMessagesManager.alreadySignedHashesWarning, true) } null -> Unit } 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 b9996b1c18..c44801d9c8 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 @@ -16,9 +16,7 @@ object SignedHashesWarningDialog { setPositiveButton(R.string.common_understand) { _, _ -> store.dispatch(WalletAction.Warnings.CheckHashesCount.SaveCardId) store.dispatch( - GlobalAction.HideWarningMessage( - WarningMessagesManager.signedHashesMultiWalletWarning(), - ), + GlobalAction.HideWarningMessage(WarningMessagesManager.signedHashesMultiWalletWarning), ) } setNegativeButton(R.string.common_cancel) { _, _ -> }