diff --git a/app/src/main/assets/tangem-app-config b/app/src/main/assets/tangem-app-config index 64ae04d208..f50133547b 160000 --- a/app/src/main/assets/tangem-app-config +++ b/app/src/main/assets/tangem-app-config @@ -1 +1 @@ -Subproject commit 64ae04d2086e5a605dd4da3cba4af32a60d46c79 +Subproject commit f50133547b5e19fb7ad32e64370573d60f6791fd diff --git a/app/src/main/java/com/tangem/tap/domain/TapWalletManager.kt b/app/src/main/java/com/tangem/tap/domain/TapWalletManager.kt index 123c26f691..92fc72c0bf 100644 --- a/app/src/main/java/com/tangem/tap/domain/TapWalletManager.kt +++ b/app/src/main/java/com/tangem/tap/domain/TapWalletManager.kt @@ -1,6 +1,12 @@ package com.tangem.tap.domain -import com.tangem.blockchain.common.* +import com.tangem.blockchain.common.Blockchain +import com.tangem.blockchain.common.BlockchainSdkConfig +import com.tangem.blockchain.common.Token +import com.tangem.blockchain.common.Wallet +import com.tangem.blockchain.common.WalletManager +import com.tangem.blockchain.common.WalletManagerFactory +import com.tangem.common.card.Card import com.tangem.common.services.Result import com.tangem.domain.common.ScanResponse import com.tangem.domain.common.TapWorkarounds.isStart2Coin @@ -85,6 +91,12 @@ class TapWalletManager { store.dispatch(GlobalAction.SaveScanNoteResponse(data)) store.dispatch(WalletAction.SetIfTestnetCard(data.card.isTestCard)) store.dispatch(WalletAction.MultiWallet.SetIsMultiwalletAllowed(data.card.isMultiwalletAllowed)) + store.dispatch( + WalletAction.MultiWallet.ShowWalletBackupWarning( + show = data.card.settings.isBackupAllowed + && data.card.backupStatus == Card.BackupStatus.NoBackup + ) + ) loadData(data) } } diff --git a/app/src/main/java/com/tangem/tap/features/wallet/redux/WalletAction.kt b/app/src/main/java/com/tangem/tap/features/wallet/redux/WalletAction.kt index eefae0bcf6..edc6be9c6e 100644 --- a/app/src/main/java/com/tangem/tap/features/wallet/redux/WalletAction.kt +++ b/app/src/main/java/com/tangem/tap/features/wallet/redux/WalletAction.kt @@ -75,10 +75,15 @@ sealed class WalletAction : Action { ) : MultiWallet() data class SelectWallet(val walletData: WalletData?) : MultiWallet() - data class RemoveWallet(val walletData: WalletData, val fromWalletDetails: Boolean = true) : MultiWallet() + data class RemoveWallet(val walletData: WalletData, val fromWalletDetails: Boolean = true) : + MultiWallet() + data class TryToRemoveWallet(val walletData: WalletData) : MultiWallet() data class SetPrimaryBlockchain(val blockchain: Blockchain) : MultiWallet() data class SetPrimaryToken(val token: Token) : MultiWallet() + + data class ShowWalletBackupWarning(val show: Boolean) : MultiWallet() + object BackupWallet : MultiWallet() } sealed class Warnings : WalletAction() { 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 ce660968f6..557b32f260 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 @@ -1,7 +1,11 @@ package com.tangem.tap.features.wallet.redux import android.graphics.Bitmap -import com.tangem.blockchain.common.* +import com.tangem.blockchain.common.Amount +import com.tangem.blockchain.common.Blockchain +import com.tangem.blockchain.common.Token +import com.tangem.blockchain.common.Wallet +import com.tangem.blockchain.common.WalletManager import com.tangem.blockchain.common.address.AddressType import com.tangem.common.extensions.isZero import com.tangem.domain.common.extensions.canHandleToken @@ -16,16 +20,23 @@ import com.tangem.tap.domain.extensions.buyIsAllowed import com.tangem.tap.domain.extensions.sellIsAllowed import com.tangem.tap.domain.tokens.models.BlockchainNetwork import com.tangem.tap.features.onboarding.products.twins.redux.TwinCardsState -import com.tangem.tap.features.wallet.models.* +import com.tangem.tap.features.wallet.models.Currency +import com.tangem.tap.features.wallet.models.PendingTransaction +import com.tangem.tap.features.wallet.models.TotalBalance +import com.tangem.tap.features.wallet.models.WalletRent +import com.tangem.tap.features.wallet.models.WalletWarning +import com.tangem.tap.features.wallet.models.hasPendingTransactions +import com.tangem.tap.features.wallet.models.hasSendableAmounts +import com.tangem.tap.features.wallet.models.isSendableAmount import com.tangem.tap.features.wallet.redux.reducers.calculateTotalFiatAmount import com.tangem.tap.features.wallet.redux.reducers.findProgressState import com.tangem.tap.features.wallet.ui.BalanceStatus import com.tangem.tap.features.wallet.ui.BalanceWidgetData import com.tangem.tap.network.exchangeServices.CurrencyExchangeManager import com.tangem.tap.store -import org.rekotlin.StateType import java.math.BigDecimal import kotlin.properties.ReadOnlyProperty +import org.rekotlin.StateType data class WalletState( val state: ProgressState = ProgressState.Done, @@ -41,6 +52,7 @@ data class WalletState( val primaryToken: Token? = null, val isTestnet: Boolean = false, val totalBalance: TotalBalance? = null, + val showBackupWarning: Boolean = false, ) : StateType { // if you do not delegate - the application crashes on startup, 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 97a35f59c2..e3af462d5d 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 @@ -6,6 +6,7 @@ import com.tangem.blockchain.common.WalletManager import com.tangem.common.extensions.guard import com.tangem.tap.common.extensions.dispatchDialogShow import com.tangem.tap.common.extensions.safeUpdate +import com.tangem.tap.common.redux.global.GlobalAction import com.tangem.tap.common.redux.global.GlobalState import com.tangem.tap.common.redux.navigation.AppScreen import com.tangem.tap.common.redux.navigation.NavigationAction @@ -20,10 +21,10 @@ import com.tangem.tap.features.wallet.redux.WalletState import com.tangem.tap.features.wallet.redux.models.WalletDialog import com.tangem.tap.scope import com.tangem.tap.store +import java.math.BigDecimal import kotlinx.coroutines.Dispatchers import kotlinx.coroutines.launch import kotlinx.coroutines.withContext -import java.math.BigDecimal class MultiWalletMiddleware { fun handle( @@ -142,6 +143,13 @@ class MultiWalletMiddleware { store.dispatch(NavigationAction.PopBackTo()) } } + is WalletAction.MultiWallet.ShowWalletBackupWarning -> Unit + is WalletAction.MultiWallet.BackupWallet -> { + store.state.globalState.scanResponse?.let { + store.dispatch(NavigationAction.NavigateTo(AppScreen.OnboardingWallet)) + store.dispatch(GlobalAction.Onboarding.Start(it, fromHomeScreen = false)) + } + } // is WalletAction.MultiWallet.FindBlockchainsInUse -> { // val scanResponse = globalState.scanResponse ?: return // if (scanResponse.supportsHdWallet()) return 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 648479c03a..03cee11142 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 @@ -12,8 +12,12 @@ import com.tangem.tap.features.wallet.models.WalletRent import com.tangem.tap.features.wallet.models.filterByToken import com.tangem.tap.features.wallet.models.getPendingTransactions import com.tangem.tap.features.wallet.models.removeUnknownTransactions -import com.tangem.tap.features.wallet.redux.* +import com.tangem.tap.features.wallet.redux.WalletAction +import com.tangem.tap.features.wallet.redux.WalletData +import com.tangem.tap.features.wallet.redux.WalletMainButton +import com.tangem.tap.features.wallet.redux.WalletState import com.tangem.tap.features.wallet.redux.WalletState.Companion.UNKNOWN_AMOUNT_SIGN +import com.tangem.tap.features.wallet.redux.WalletStore import com.tangem.tap.features.wallet.ui.BalanceStatus import com.tangem.tap.features.wallet.ui.BalanceWidgetData import com.tangem.tap.features.wallet.ui.TokenData @@ -161,6 +165,10 @@ class MultiWalletReducer { // is WalletAction.MultiWallet.FindBlockchainsInUse -> state is WalletAction.MultiWallet.SaveCurrencies -> state is WalletAction.MultiWallet.TryToRemoveWallet -> state + is WalletAction.MultiWallet.ShowWalletBackupWarning -> state.copy( + showBackupWarning = action.show + ) + is WalletAction.MultiWallet.BackupWallet -> state } } diff --git a/app/src/main/java/com/tangem/tap/features/wallet/ui/wallet/MultiWalletView.kt b/app/src/main/java/com/tangem/tap/features/wallet/ui/wallet/MultiWalletView.kt index 5646b437f0..994a491ac2 100644 --- a/app/src/main/java/com/tangem/tap/features/wallet/ui/wallet/MultiWalletView.kt +++ b/app/src/main/java/com/tangem/tap/features/wallet/ui/wallet/MultiWalletView.kt @@ -91,6 +91,7 @@ class MultiWalletView : WalletView { val binding = binding ?: return handleTotalBalance(binding, state.totalBalance) + handleBackupWarning(binding, state.showBackupWarning) walletsAdapter.submitList(state.walletsData, state.primaryBlockchain, state.primaryToken) binding.btnAddToken.setOnClickListener { @@ -120,6 +121,16 @@ class MultiWalletView : WalletView { handleErrorStates(state = state, binding = binding, fragment = fragment) } + private fun handleBackupWarning( + binding: FragmentWalletBinding, + showBackupWarning: Boolean + ) = with(binding.lWalletBackupWarning) { + root.isVisible = showBackupWarning + root.setOnClickListener { + store.dispatch(WalletAction.MultiWallet.BackupWallet) + } + } + private fun handleTotalBalance( binding: FragmentWalletBinding, totalBalance: TotalBalance?, diff --git a/app/src/main/res/drawable/img_warning_triangle_24.xml b/app/src/main/res/drawable/img_warning_triangle_24.xml new file mode 100644 index 0000000000..c54d7d8f8b --- /dev/null +++ b/app/src/main/res/drawable/img_warning_triangle_24.xml @@ -0,0 +1,12 @@ + + + + diff --git a/app/src/main/res/layout/card_total_balance.xml b/app/src/main/res/layout/card_total_balance.xml deleted file mode 100644 index 1f97649e18..0000000000 --- a/app/src/main/res/layout/card_total_balance.xml +++ /dev/null @@ -1,100 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - diff --git a/app/src/main/res/layout/fragment_wallet.xml b/app/src/main/res/layout/fragment_wallet.xml index 17bf714628..1545257fc9 100644 --- a/app/src/main/res/layout/fragment_wallet.xml +++ b/app/src/main/res/layout/fragment_wallet.xml @@ -57,12 +57,13 @@ android:layout_marginTop="8dp" android:layout_marginEnd="16dp" android:layout_marginBottom="12dp" - android:adjustViewBounds="true" - android:elevation="3dp" - android:maxHeight="215dp" - android:scaleType="fitCenter" - android:src="@drawable/card_placeholder_black" - app:layout_constraintTop_toTopOf="parent" /> + android:adjustViewBounds="true" + android:elevation="3dp" + android:maxHeight="215dp" + android:scaleType="fitCenter" + android:src="@drawable/card_placeholder_black" + android:contentDescription="@null" + app:layout_constraintTop_toTopOf="parent" /> + android:layout_width="match_parent" + android:layout_height="wrap_content" + android:layout_marginTop="12dp" + android:minHeight="0dp" + android:nestedScrollingEnabled="false" + android:overScrollMode="never" + app:layout_constraintEnd_toEndOf="parent" + app:layout_constraintStart_toStartOf="parent" + app:layout_constraintTop_toBottomOf="@id/barrier" /> + android:id="@+id/l_wallet_backup_warning" + layout="@layout/layout_wallet_backup_warning" + android:layout_width="match_parent" + android:layout_height="wrap_content" + android:layout_marginTop="16dp" + android:layout_marginStart="16dp" + android:layout_marginEnd="16dp" + android:visibility="gone" + app:layout_constraintTop_toBottomOf="@id/rv_warning_messages" /> + + + android:id="@+id/rv_multiwallet" + android:layout_width="match_parent" + android:layout_height="wrap_content" + android:layout_marginTop="16dp" + android:nestedScrollingEnabled="false" + app:layout_constraintEnd_toEndOf="parent" + app:layout_constraintStart_toStartOf="parent" + app:layout_constraintTop_toBottomOf="@id/rv_pending_transaction" /> + + + + @@ -171,28 +208,6 @@ android:text="@string/main_manage_tokens" android:elevation="4dp" app:cornerRadius="8dp" - tools:visibility="gone" /> - - - - + app:layout_constraintBottom_toBottomOf="parent" /> diff --git a/app/src/main/res/layout/layout_card_total_balance.xml b/app/src/main/res/layout/layout_card_total_balance.xml new file mode 100644 index 0000000000..fe3484f373 --- /dev/null +++ b/app/src/main/res/layout/layout_card_total_balance.xml @@ -0,0 +1,86 @@ + + + + + + + + + + + + + + + + + + + diff --git a/app/src/main/res/layout/layout_wallet_backup_warning.xml b/app/src/main/res/layout/layout_wallet_backup_warning.xml new file mode 100644 index 0000000000..119ab12734 --- /dev/null +++ b/app/src/main/res/layout/layout_wallet_backup_warning.xml @@ -0,0 +1,70 @@ + + + + + + + + + + + + + + + + diff --git a/app/src/main/res/values-ru/strings_final.xml b/app/src/main/res/values-ru/strings_final.xml index 1dca54fc84..d6324862d0 100644 --- a/app/src/main/res/values-ru/strings_final.xml +++ b/app/src/main/res/values-ru/strings_final.xml @@ -64,4 +64,7 @@ Сеть %s не найдена. Пожалуйста, добавьте её и попробуйте заново. Сеть %s + + Бэкап кошелька не был произведен + Чтобы защитить свои активы, мы советуем вам выполнить эту процедуру diff --git a/app/src/main/res/values/strings_final.xml b/app/src/main/res/values/strings_final.xml index bedeb1ae12..bedbde3100 100644 --- a/app/src/main/res/values/strings_final.xml +++ b/app/src/main/res/values/strings_final.xml @@ -64,4 +64,7 @@ %s network not found. Please, add it first and try again. %s network + + Your wallet has not been backed up + To protect your assets, we advise you to carry out this procedure