diff --git a/app/src/main/java/com/tangem/tap/common/redux/AppReducer.kt b/app/src/main/java/com/tangem/tap/common/redux/AppReducer.kt index 3888f22fcf..0ce1e1e244 100644 --- a/app/src/main/java/com/tangem/tap/common/redux/AppReducer.kt +++ b/app/src/main/java/com/tangem/tap/common/redux/AppReducer.kt @@ -1,9 +1,9 @@ package com.tangem.tap.common.redux import com.tangem.tap.common.redux.global.globalReducer -import com.tangem.tap.common.redux.navigation.navigationReducer +import com.tangem.tap.common.redux.navigation.NavigationReducer import com.tangem.tap.features.send.redux.SendReducer -import com.tangem.tap.features.wallet.redux.walletReducer +import com.tangem.tap.features.wallet.redux.WalletReducer import org.rekotlin.Action fun appReducer(action: Action, state: AppState?): AppState { @@ -11,9 +11,9 @@ fun appReducer(action: Action, state: AppState?): AppState { if (action is AppAction.RestoreState) return action.state return AppState( - navigationState = navigationReducer(action, state), + navigationState = NavigationReducer.reduce(action, state), globalState = globalReducer(action, state), - walletState = walletReducer(action, state), + walletState = WalletReducer.reduce(action, state), sendState = SendReducer.reduce(action, state.sendState) ) } diff --git a/app/src/main/java/com/tangem/tap/common/redux/global/GlobalAction.kt b/app/src/main/java/com/tangem/tap/common/redux/global/GlobalAction.kt index 26e4b46f87..8a4412c114 100644 --- a/app/src/main/java/com/tangem/tap/common/redux/global/GlobalAction.kt +++ b/app/src/main/java/com/tangem/tap/common/redux/global/GlobalAction.kt @@ -1,13 +1,11 @@ package com.tangem.tap.common.redux.global -import com.tangem.blockchain.common.WalletManager -import com.tangem.commands.Card +import com.tangem.tap.domain.tasks.ScanNoteResponse import org.rekotlin.Action import java.math.BigDecimal sealed class GlobalAction : Action { - data class LoadCard(val card: Card) : GlobalAction() - data class LoadWalletManager(val walletManager: WalletManager) : GlobalAction() + data class SaveScanNoteResponse(val scanNoteResponse: ScanNoteResponse) : GlobalAction() data class SetFiatRate(val fiatRates: Pair) : GlobalAction() } \ No newline at end of file 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 6236a643d6..71fa1cfb50 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 @@ -10,15 +10,13 @@ fun globalReducer(action: Action, state: AppState): GlobalState { var newState = state.globalState when (action) { - is GlobalAction.LoadCard -> newState = newState.copy(card = action.card) + is GlobalAction.SaveScanNoteResponse -> + newState = newState.copy(scanNoteResponse = action.scanNoteResponse) is GlobalAction.SetFiatRate -> { val rates = newState.fiatRates.rates.toMutableMap() rates[action.fiatRates.first] = action.fiatRates.second newState = newState.copy(fiatRates = FiatRates(rates)) } - is GlobalAction.LoadWalletManager -> - newState = newState.copy(walletManager = action.walletManager) - } return newState } \ No newline at end of file diff --git a/app/src/main/java/com/tangem/tap/common/redux/global/GlobalState.kt b/app/src/main/java/com/tangem/tap/common/redux/global/GlobalState.kt index e31211da52..6ea19cc94e 100644 --- a/app/src/main/java/com/tangem/tap/common/redux/global/GlobalState.kt +++ b/app/src/main/java/com/tangem/tap/common/redux/global/GlobalState.kt @@ -1,14 +1,12 @@ package com.tangem.tap.common.redux.global -import com.tangem.blockchain.common.WalletManager -import com.tangem.commands.Card import com.tangem.tap.domain.TapWalletManager +import com.tangem.tap.domain.tasks.ScanNoteResponse import org.rekotlin.StateType import java.math.BigDecimal data class GlobalState( - val card: Card? = null, - val walletManager: WalletManager? = null, + val scanNoteResponse: ScanNoteResponse? = null, val tapWalletManager: TapWalletManager = TapWalletManager(), val fiatRates: FiatRates = FiatRates(emptyMap()), ) : StateType 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 ae05c06a6e..a4ce784435 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,7 +4,13 @@ import com.tangem.tap.common.extensions.getPreviousScreen import com.tangem.tap.common.redux.AppState import org.rekotlin.Action -fun navigationReducer(action: Action, state: AppState): NavigationState { +class NavigationReducer { + companion object { + fun reduce(action: Action, state: AppState): NavigationState = internalReduce(action, state) + } +} + +private fun internalReduce(action: Action, state: AppState): NavigationState { val navigationAction = action as? NavigationAction ?: return state.navigationState val navState = state.navigationState @@ -15,7 +21,7 @@ fun navigationReducer(action: Action, state: AppState): NavigationState { } is NavigationAction.PopBackTo -> { val screen = - navigationAction.screen ?: navState.activity?.get()?.getPreviousScreen() + navigationAction.screen ?: navState.activity?.get()?.getPreviousScreen() val index = navState.backStack.lastIndexOf(screen) + 1 state.navigationState.copy(backStack = navState.backStack.subList(0, index)) } 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 99368af1ab..0b4acf90e2 100644 --- a/app/src/main/java/com/tangem/tap/domain/TapErrors.kt +++ b/app/src/main/java/com/tangem/tap/domain/TapErrors.kt @@ -7,4 +7,5 @@ sealed class TapError(@StringRes val localizedMessage: Int): Throwable() { object PayIdAlreadyCreated: TapError(R.string.error_payid_already_created) object PayIdCreatingError: TapError(R.string.error_creating_payid) object PayIdEmptyField: TapError(R.string.wallet_create_payid_empty) + object UnknownBlockchain: TapError(R.string.wallet_unknown_blockchain) } \ No newline at end of file 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 bd5aa7361c..63b2b4ef43 100644 --- a/app/src/main/java/com/tangem/tap/domain/TapWalletManager.kt +++ b/app/src/main/java/com/tangem/tap/domain/TapWalletManager.kt @@ -24,7 +24,7 @@ class TapWalletManager { private val tangemService = TangemService() suspend fun loadWalletData() { - val walletManager = store.state.globalState.walletManager + val walletManager = store.state.globalState.scanNoteResponse?.walletManager if (walletManager == null) { store.dispatch(WalletAction.LoadWallet.Failure()) return @@ -38,7 +38,9 @@ class TapWalletManager { withContext(Dispatchers.Main) { when (result) { is Result.Success -> { - store.dispatch(WalletAction.LoadArtwork.Success(result.data.byteStream().readBytes())) + store.dispatch(WalletAction.LoadArtwork.Success( + artworkId, result.data.byteStream().readBytes()) + ) } is Result.Failure -> store.dispatch(WalletAction.LoadArtwork.Failure) } @@ -51,8 +53,9 @@ class TapWalletManager { } suspend fun loadFiatRate() { - val blockchainCurrency = store.state.globalState.walletManager?.wallet?.blockchain?.currency - val tokenCurrency = store.state.globalState.walletManager?.wallet?.token?.symbol + val wallet = store.state.globalState.scanNoteResponse?.walletManager?.wallet + val blockchainCurrency = wallet?.blockchain?.currency + val tokenCurrency = wallet?.token?.symbol val blockchainRate = blockchainCurrency?.let { coinMarketCapService.getRate(it) } val tokenRate = tokenCurrency?.let { coinMarketCapService.getRate(it) } @@ -66,9 +69,8 @@ class TapWalletManager { suspend fun onCardScanned(data: ScanNoteResponse) { withContext(Dispatchers.Main) { - store.dispatch(GlobalAction.LoadCard(data.card)) + store.dispatch(GlobalAction.SaveScanNoteResponse(data)) if (data.walletManager != null) { - store.dispatch(GlobalAction.LoadWalletManager(data.walletManager)) data.verifyResponse?.artworkInfo?.id?.let { store.dispatch(WalletAction.LoadArtwork(data.card, it)) } @@ -113,13 +115,14 @@ class TapWalletManager { private suspend fun loadPayIdIfNeeded(): Result? { + val scanNoteResponse = store.state.globalState.scanNoteResponse if (!TapConfig.usePayId || store.state.walletState.payIdData.payIdState == PayIdState.Disabled || - store.state.globalState.walletManager?.wallet?.blockchain?.isPayIdSupported() == false) { + scanNoteResponse?.walletManager?.wallet?.blockchain?.isPayIdSupported() == false) { return null } - val cardId = store.state.globalState.card?.cardId - val publicKey = store.state.globalState.card?.cardPublicKey + val cardId = scanNoteResponse?.card?.cardId + val publicKey = scanNoteResponse?.card?.cardPublicKey if (cardId == null || publicKey == null) { return null } diff --git a/app/src/main/java/com/tangem/tap/features/home/HomeFragment.kt b/app/src/main/java/com/tangem/tap/features/home/HomeFragment.kt index dd556e3e40..4f1338e98e 100644 --- a/app/src/main/java/com/tangem/tap/features/home/HomeFragment.kt +++ b/app/src/main/java/com/tangem/tap/features/home/HomeFragment.kt @@ -3,6 +3,7 @@ package com.tangem.tap.features.home import android.os.Bundle import android.view.View import androidx.fragment.app.Fragment +import androidx.transition.TransitionInflater import com.tangem.tap.features.home.redux.HomeAction import com.tangem.tap.store import com.tangem.wallet.R @@ -17,5 +18,11 @@ class HomeFragment : Fragment(R.layout.fragment_home) { btn_shop?.setOnClickListener { store.dispatch(HomeAction.GoToShop(requireContext())) } } + override fun onCreate(savedInstanceState: Bundle?) { + super.onCreate(savedInstanceState) + val inflater = TransitionInflater.from(requireContext()) + exitTransition = inflater.inflateTransition(R.transition.fade) + } + } \ No newline at end of file diff --git a/app/src/main/java/com/tangem/tap/features/send/redux/SendMiddleware.kt b/app/src/main/java/com/tangem/tap/features/send/redux/SendMiddleware.kt index f734d0816c..dbfff128f1 100644 --- a/app/src/main/java/com/tangem/tap/features/send/redux/SendMiddleware.kt +++ b/app/src/main/java/com/tangem/tap/features/send/redux/SendMiddleware.kt @@ -37,7 +37,7 @@ private fun handleSendAction(action: Action) { internal class AddressPayIdHandler { fun handle(data: String?) { - val walletManager = store.state.globalState.walletManager ?: return + val walletManager = store.state.globalState.scanNoteResponse?.walletManager ?: return val clipboardData = data ?: return if (PayIdManager.isPayId(clipboardData)) { @@ -61,7 +61,7 @@ internal class AddressPayIdHandler { private suspend fun verifyPayID(walletManager: WalletManager, payID: String?): String? { val cardId = walletManager.cardId - val publicKey = store.state.globalState.card?.cardPublicKey + val publicKey = store.state.globalState.scanNoteResponse?.card?.cardPublicKey // val result = PayIdManager().getPayId(cardId, publicKey.toHexString()) // withContext(Dispatchers.Main) { 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 c6e18b2ed2..7923065e3a 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 @@ -12,6 +12,8 @@ import java.math.BigDecimal sealed class WalletAction : Action { + object LoadData : WalletAction() + object LoadWallet : WalletAction() { data class Success(val wallet: Wallet): WalletAction() data class NoAccount(val amountToCreateAccount: Int): WalletAction() @@ -27,7 +29,7 @@ sealed class WalletAction : Action { object Failure: WalletAction() } data class LoadArtwork(val card: Card, val artworkId: String) : WalletAction() { - data class Success(val artwork: ByteArray) : WalletAction() + data class Success(val artworkId: String, val artwork: ByteArray) : WalletAction() object Failure: WalletAction() } object Scan : WalletAction() diff --git a/app/src/main/java/com/tangem/tap/features/wallet/redux/WalletMiddleware.kt b/app/src/main/java/com/tangem/tap/features/wallet/redux/WalletMiddleware.kt index 451c1d7cab..643df319d3 100644 --- a/app/src/main/java/com/tangem/tap/features/wallet/redux/WalletMiddleware.kt +++ b/app/src/main/java/com/tangem/tap/features/wallet/redux/WalletMiddleware.kt @@ -58,9 +58,9 @@ val walletMiddleware: Middleware = { dispatch, state -> } is WalletAction.CreatePayId.CompleteCreatingPayId -> { scope.launch { - val cardId = store.state.globalState.card?.cardId + val cardId = store.state.globalState.scanNoteResponse?.card?.cardId val wallet = store.state.walletState.wallet - val publicKey = store.state.globalState.card?.cardPublicKey + val publicKey = store.state.globalState.scanNoteResponse?.card?.cardPublicKey if (cardId != null && wallet != null && publicKey != null) { val result = PayIdManager().setPayId( cardId, publicKey.toHexString(), @@ -90,14 +90,21 @@ val walletMiddleware: Middleware = { dispatch, state -> } } } + is WalletAction.LoadData -> { + scope.launch { + store.state.globalState.scanNoteResponse?.let { + store.state.globalState.tapWalletManager.onCardScanned(it) + } + } + } is WalletAction.CopyAddress -> { - store.state.walletState.wallet?.address?.let { + store.state.walletState.addressData?.address?.let { action.context.copyToClipboard(it) store.dispatch(WalletAction.CopyAddress.Success) } } is WalletAction.ExploreAddress -> { - val uri = Uri.parse(store.state.walletState.wallet?.exploreUrl) + val uri = Uri.parse(store.state.walletState.addressData?.exploreUrl) val intent = Intent(Intent.ACTION_VIEW, uri) ContextCompat.startActivity(action.context, intent, null) } diff --git a/app/src/main/java/com/tangem/tap/features/wallet/redux/WalletReducer.kt b/app/src/main/java/com/tangem/tap/features/wallet/redux/WalletReducer.kt index 9d2aa3e128..30c87d7ea9 100644 --- a/app/src/main/java/com/tangem/tap/features/wallet/redux/WalletReducer.kt +++ b/app/src/main/java/com/tangem/tap/features/wallet/redux/WalletReducer.kt @@ -12,7 +12,13 @@ import com.tangem.tap.features.wallet.ui.BalanceWidgetData import com.tangem.tap.features.wallet.ui.TokenData import org.rekotlin.Action -fun walletReducer(action: Action, state: AppState): WalletState { +class WalletReducer { + companion object { + fun reduce(action: Action, state: AppState): WalletState = internalReduce(action, state) + } +} + +private fun internalReduce(action: Action, state: AppState): WalletState { if (action !is WalletAction) return state.walletState @@ -24,15 +30,31 @@ fun walletReducer(action: Action, state: AppState): WalletState { currencyData = BalanceWidgetData(BalanceStatus.EmptyCard), mainButton = WalletMainButton.CreateWalletButton(true) ) - is WalletAction.LoadWallet -> newState = WalletState( - state = ProgressState.Loading, - currencyData = BalanceWidgetData( - BalanceStatus.Loading, - state.globalState.walletManager?.wallet?.blockchain?.fullName - ), - mainButton = WalletMainButton.SendButton(false) + is WalletAction.LoadWallet -> { + val wallet = state.globalState.scanNoteResponse?.walletManager?.wallet + val addressData = if (wallet == null) { + null + } else { + AddressData(wallet.address, wallet.shareUrl, wallet.exploreUrl) + } + val currentArtworkId = state.globalState.scanNoteResponse?.verifyResponse?.artworkInfo?.id + val cardImage = if (newState.cardImage?.artworkId == currentArtworkId) { + newState.cardImage + } else { + null + } + newState = WalletState( + state = ProgressState.Loading, + cardImage = cardImage, + currencyData = BalanceWidgetData( + BalanceStatus.Loading, + wallet?.blockchain?.fullName + ), + addressData = addressData, + mainButton = WalletMainButton.SendButton(false) - ) + ) + } is WalletAction.LoadWallet.Success -> { val token = action.wallet.amounts[AmountType.Token] val tokenData = if (token != null) { @@ -62,7 +84,7 @@ fun walletReducer(action: Action, state: AppState): WalletState { ) } is WalletAction.LoadWallet.NoAccount -> { - val wallet = state.globalState.walletManager?.wallet + val wallet = state.globalState.scanNoteResponse?.walletManager?.wallet newState = newState.copy( state = ProgressState.Done, wallet = wallet, currencyData = BalanceWidgetData( @@ -85,26 +107,26 @@ fun walletReducer(action: Action, state: AppState): WalletState { val fiatAmount = if (currency == newState.wallet?.blockchain?.currency) { newState.wallet?.amounts?.get(AmountType.Coin)?.value?.toFiatString(rate) } else { - null + newState.currencyData.fiatAmount } val tokenFiatAmount = if (currency == newState.wallet?.token?.symbol) { newState.wallet?.amounts?.get(AmountType.Token)?.value?.toFiatString(rate) } else { - null + newState.currencyData.token?.fiatAmount } newState = newState.copy(currencyData = newState.currencyData.copy( fiatAmount = fiatAmount, token = newState.currencyData.token?.copy(fiatAmount = tokenFiatAmount) )) } - is WalletAction.LoadArtwork -> { - newState = newState.copy(cardImage = null) - } +// is WalletAction.LoadArtwork -> { +// newState = newState.copy(cardImage = null) +// } is WalletAction.LoadArtwork.Success -> { - newState = newState.copy(cardImage = action.artwork.toBitmap()) + newState = newState.copy(cardImage = Artwork(action.artworkId, action.artwork.toBitmap())) } is WalletAction.ShowQrCode -> { - newState = newState.copy(qrCode = newState.wallet?.shareUrl?.toQrCode()) + newState = newState.copy(qrCode = newState.addressData?.shareUrl?.toQrCode()) } is WalletAction.HideQrCode -> { newState = newState.copy(qrCode = null) 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 fb19fa5fc9..171670bdca 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 @@ -8,8 +8,9 @@ import org.rekotlin.StateType data class WalletState( val state: ProgressState = ProgressState.Done, - val cardImage: Bitmap? = null, + val cardImage: Artwork? = null, val wallet: Wallet? = null, + val addressData: AddressData? = null, val currencyData: BalanceWidgetData = BalanceWidgetData(), val payIdData: PayIdData = PayIdData(), val qrCode: Bitmap? = null, @@ -32,4 +33,15 @@ enum class CreatingPayIdState { EnterPayId, Waiting } sealed class WalletMainButton(enabled: Boolean) : Button(enabled) { class SendButton(enabled: Boolean) : WalletMainButton(enabled) class CreateWalletButton(enabled: Boolean) : WalletMainButton(enabled) -} \ No newline at end of file +} + +data class AddressData( + val address: String, + val shareUrl: String, + val exploreUrl: String +) + +data class Artwork( + val artworkId: String, + val artwork: Bitmap +) \ No newline at end of file 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 c3431b742a..6f8d7dac2a 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 @@ -55,7 +55,8 @@ class BalanceWidget( fragment.l_balance.show() fragment.l_balance_error.hide() fragment.tv_currency.text = data.currency - fragment.tv_amount.text = "-" + fragment.tv_currency_symbol.text = "-" + fragment.tv_amount.text = "" fragment.tv_fiat_amount.hide() showStatus(R.id.tv_status_loading) fragment.l_token.hide() @@ -65,6 +66,7 @@ class BalanceWidget( fragment.l_balance_error.hide() fragment.tv_currency.text = data.currency fragment.tv_amount.text = data.amount + fragment.tv_currency_symbol.text = data.currencySymbol fragment.tv_fiat_amount.show() fragment.tv_fiat_amount.text = data.fiatAmount showStatus(R.id.tv_status_verified) 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 47cc4d3c25..e38da8854f 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 @@ -1,9 +1,11 @@ package com.tangem.tap.features.wallet.ui +import android.graphics.Bitmap import android.os.Bundle import android.view.View import androidx.activity.OnBackPressedCallback import androidx.fragment.app.Fragment +import androidx.transition.TransitionInflater import com.tangem.tap.common.extensions.getDrawable import com.tangem.tap.common.extensions.hide import com.tangem.tap.common.extensions.show @@ -18,6 +20,7 @@ import kotlinx.android.synthetic.main.fragment_wallet.* import kotlinx.android.synthetic.main.layout_address.* import org.rekotlin.StoreSubscriber + class WalletFragment : Fragment(R.layout.fragment_wallet), StoreSubscriber { private var qrDialog: QrDialog? = null @@ -30,6 +33,9 @@ class WalletFragment : Fragment(R.layout.fragment_wallet), StoreSubscriber R.string.wallet_button_send - is WalletMainButton.CreateWalletButton -> R.string.wallet_button_create_wallet - } - btn_main.text = getString(buttonTitle) - btn_main.isEnabled = state.mainButton.enabled - - btn_main.setOnClickListener { - when (state.mainButton) { - is WalletMainButton.SendButton -> store.dispatch(NavigationAction.NavigateTo(AppScreen.Send)) - is WalletMainButton.CreateWalletButton -> store.dispatch(WalletAction.CreateWallet) - } - } - - if (state.qrCode != null && state.wallet?.shareUrl != null) { - qrDialog = QrDialog(requireContext()) - qrDialog?.showQr(state.qrCode, state.wallet.shareUrl) + if (state.qrCode != null && state.addressData?.shareUrl != null) { + if (qrDialog == null) qrDialog = QrDialog(requireContext()) + qrDialog?.showQr(state.qrCode, state.addressData.shareUrl) } else { qrDialog?.dismiss() } - when (state.state) { - ProgressState.Loading -> { - l_balance.show() - BalanceWidget(this, state.currencyData).setup() - } - ProgressState.Done -> { - l_balance.show() - BalanceWidget(this, state.currencyData).setup() - } - ProgressState.Error -> { + l_balance.show() + BalanceWidget(this, state.currencyData).setup() - } + if (state.state == ProgressState.Done) { + srl_wallet.isRefreshing = false } when (state.payIdData.payIdState) { @@ -150,5 +123,43 @@ class WalletFragment : Fragment(R.layout.fragment_wallet), StoreSubscriber R.string.wallet_button_send + is WalletMainButton.CreateWalletButton -> R.string.wallet_button_create_wallet + } + btn_main.text = getString(buttonTitle) + btn_main.isEnabled = state.mainButton.enabled + + btn_main.setOnClickListener { + when (state.mainButton) { + is WalletMainButton.SendButton -> store.dispatch(NavigationAction.NavigateTo(AppScreen.Send)) + is WalletMainButton.CreateWalletButton -> store.dispatch(WalletAction.CreateWallet) + } + } + } + + private fun setupAddressCard(state: WalletState) { + if (state.addressData != null) { + l_address?.show() + tv_address.text = state.addressData.address + tv_explore?.setOnClickListener { + store.dispatch(WalletAction.ExploreAddress(requireContext())) + } + } else { + l_address?.hide() + } + } + + private fun setupCardImage(cardImage: Bitmap?) { + if (cardImage != null) { + iv_card.setImageBitmap(cardImage) + } else { + iv_card.setImageDrawable(getDrawable(R.drawable.card_default)) + } + } } \ No newline at end of file diff --git a/app/src/main/res/color/btn_tap_text_color.xml b/app/src/main/res/color/btn_tap_text_color.xml new file mode 100644 index 0000000000..01e0752f01 --- /dev/null +++ b/app/src/main/res/color/btn_tap_text_color.xml @@ -0,0 +1,7 @@ + + + + + \ No newline at end of file diff --git a/app/src/main/res/color/selector_btn_black.xml b/app/src/main/res/color/selector_btn_black.xml new file mode 100644 index 0000000000..5fae92a59d --- /dev/null +++ b/app/src/main/res/color/selector_btn_black.xml @@ -0,0 +1,6 @@ + + + + + \ No newline at end of file diff --git a/app/src/main/res/color/selector_btn_green.xml b/app/src/main/res/color/selector_btn_green.xml new file mode 100644 index 0000000000..32bd8b9847 --- /dev/null +++ b/app/src/main/res/color/selector_btn_green.xml @@ -0,0 +1,6 @@ + + + + + \ No newline at end of file diff --git a/app/src/main/res/drawable/card_tg057.png b/app/src/main/res/drawable/card_tg057.png deleted file mode 100644 index ec90d9cf93..0000000000 Binary files a/app/src/main/res/drawable/card_tg057.png and /dev/null differ diff --git a/app/src/main/res/drawable/ic_copy.xml b/app/src/main/res/drawable/ic_copy.xml index 1e5f97197d..db40f4b5b9 100644 --- a/app/src/main/res/drawable/ic_copy.xml +++ b/app/src/main/res/drawable/ic_copy.xml @@ -1,19 +1,9 @@ + android:width="17dp" + android:height="20dp" + android:viewportWidth="17" + android:viewportHeight="20"> - - + android:pathData="M12.3334,0.8333H2.3334C1.4167,0.8333 0.6667,1.5833 0.6667,2.5V14.1667H2.3334V2.5H12.3334V0.8333ZM11.5001,4.1667L16.5001,9.1667V17.5C16.5001,18.4167 15.7501,19.1667 14.8334,19.1667H5.6584C4.7417,19.1667 4.0001,18.4167 4.0001,17.5L4.0084,5.8333C4.0084,4.9167 4.7501,4.1667 5.6667,4.1667H11.5001ZM10.6667,10H15.2501L10.6667,5.4167V10Z" + android:fillColor="#1C1C1E"/> diff --git a/app/src/main/res/drawable/ic_qr_code_create.xml b/app/src/main/res/drawable/ic_qr_code_create.xml deleted file mode 100644 index a09bd4ea60..0000000000 --- a/app/src/main/res/drawable/ic_qr_code_create.xml +++ /dev/null @@ -1,88 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/app/src/main/res/drawable/ic_qr_code_show.xml b/app/src/main/res/drawable/ic_qr_code_show.xml new file mode 100644 index 0000000000..d59f4de145 --- /dev/null +++ b/app/src/main/res/drawable/ic_qr_code_show.xml @@ -0,0 +1,84 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/app/src/main/res/drawable/ic_warning.xml b/app/src/main/res/drawable/ic_warning.xml new file mode 100644 index 0000000000..81f2751c0c --- /dev/null +++ b/app/src/main/res/drawable/ic_warning.xml @@ -0,0 +1,15 @@ + + + + + diff --git a/app/src/main/res/drawable/ic_warning_small.xml b/app/src/main/res/drawable/ic_warning_small.xml new file mode 100644 index 0000000000..a42413f750 --- /dev/null +++ b/app/src/main/res/drawable/ic_warning_small.xml @@ -0,0 +1,16 @@ + + + + + + diff --git a/app/src/main/res/layout/fragment_home.xml b/app/src/main/res/layout/fragment_home.xml index c41550aa8d..ce04dd4978 100644 --- a/app/src/main/res/layout/fragment_home.xml +++ b/app/src/main/res/layout/fragment_home.xml @@ -70,12 +70,15 @@ android:layout_marginBottom="33dp" android:text="@string/home_button_yes" app:layout_constraintBottom_toBottomOf="parent" + app:layout_constraintEnd_toStartOf="@+id/btn_shop" + app:layout_constraintHorizontal_bias="0.5" + app:layout_constraintHorizontal_chainStyle="packed" app:layout_constraintStart_toStartOf="parent" /> + app:layout_constraintHorizontal_bias="0.5" + app:layout_constraintStart_toEndOf="@+id/btn_yes" /> \ No newline at end of file diff --git a/app/src/main/res/layout/fragment_wallet.xml b/app/src/main/res/layout/fragment_wallet.xml index 4eba913cf1..390f561132 100644 --- a/app/src/main/res/layout/fragment_wallet.xml +++ b/app/src/main/res/layout/fragment_wallet.xml @@ -1,73 +1,113 @@ - + android:background="@color/backgroundLightGray" + android:orientation="vertical"> - - - + android:background="@color/backgroundLightGray" + android:fitsSystemWindows="true" + app:liftOnScroll="true"> - + + + + + android:layout_height="match_parent" + app:layout_behavior="@string/appbar_scrolling_view_behavior"> + + + + + + + + - + - + - + + - \ No newline at end of file + + + + + \ No newline at end of file diff --git a/app/src/main/res/layout/layout_address.xml b/app/src/main/res/layout/layout_address.xml index 859cfc42ce..3fafd3e5cb 100644 --- a/app/src/main/res/layout/layout_address.xml +++ b/app/src/main/res/layout/layout_address.xml @@ -2,7 +2,7 @@ @@ -19,6 +19,7 @@ android:elevation="3dp"> @@ -57,31 +58,53 @@ app:layout_constraintTop_toBottomOf="@id/tv_address" /> - + app:layout_constraintTop_toTopOf="parent"> - + + + + + app:layout_constraintTop_toTopOf="parent"> + + + + @@ -70,17 +70,36 @@ + + + tools:text="BTC" /> + android:src="@drawable/ic_warning" /> + \ No newline at end of file diff --git a/app/src/main/res/transition/slide_right.xml b/app/src/main/res/transition/slide_right.xml new file mode 100644 index 0000000000..45e1e04870 --- /dev/null +++ b/app/src/main/res/transition/slide_right.xml @@ -0,0 +1,4 @@ + + \ No newline at end of file diff --git a/app/src/main/res/values/colors.xml b/app/src/main/res/values/colors.xml index e8cd99581f..1883882991 100644 --- a/app/src/main/res/values/colors.xml +++ b/app/src/main/res/values/colors.xml @@ -6,7 +6,9 @@ #1ACE80 @color/accent + #661ACE80 @color/darkGray6 + #661C1C1E #5AC461 #C4291C @@ -20,6 +22,7 @@ #1C1C1E #F9F9FA + #F9F9F9 #F4F5F6 #DE000000 diff --git a/app/src/main/res/values/strings.xml b/app/src/main/res/values/strings.xml index a1143055bf..b9ac4da648 100644 --- a/app/src/main/res/values/strings.xml +++ b/app/src/main/res/values/strings.xml @@ -17,6 +17,7 @@ Create PayID Verified Balance Blockchain is unreachable + Uh oh!\nYour Tangem card was made to work with a different application. Please see the name and instructions on your card, and install the correct app. Balance is loading… Account is not created Empty Card diff --git a/app/src/main/res/values/styles.xml b/app/src/main/res/values/styles.xml index 24e04d7247..0c965e8d30 100644 --- a/app/src/main/res/values/styles.xml +++ b/app/src/main/res/values/styles.xml @@ -6,6 +6,7 @@ @color/colorSecondary @color/darkGray6 true + @color/backgroundLightGray false @@ -26,20 +27,25 @@ 0dp 14sp bold + @color/btn_tap_text_color false 0 - @color/tapButtonColor + @color/selector_btn_green @dimen/btn_corner_radius @font/saira_semi_condensed_regular + 93dp + 48dp