diff --git a/app/build.gradle b/app/build.gradle index a54de48953..c80ef90109 100644 --- a/app/build.gradle +++ b/app/build.gradle @@ -102,6 +102,7 @@ dependencies { // Firebase implementation 'com.google.firebase:firebase-crashlytics:17.2.2' + implementation 'com.google.firebase:firebase-analytics:17.6.0' testImplementation 'junit:junit:4.13' testImplementation "com.google.truth:truth:1.0.1" diff --git a/app/src/main/AndroidManifest.xml b/app/src/main/AndroidManifest.xml index 0def014c91..2b7b764bfc 100644 --- a/app/src/main/AndroidManifest.xml +++ b/app/src/main/AndroidManifest.xml @@ -14,6 +14,7 @@ + diff --git a/app/src/main/java/com/tangem/tap/MainActivity.kt b/app/src/main/java/com/tangem/tap/MainActivity.kt index ffa1f2aa54..d8e89fe868 100644 --- a/app/src/main/java/com/tangem/tap/MainActivity.kt +++ b/app/src/main/java/com/tangem/tap/MainActivity.kt @@ -5,7 +5,6 @@ import android.content.pm.ActivityInfo import android.nfc.NfcAdapter import android.nfc.Tag import android.os.Bundle -import android.os.Handler import androidx.appcompat.app.AppCompatActivity import com.tangem.CardFilter import com.tangem.Config @@ -78,7 +77,7 @@ class MainActivity : AppCompatActivity() { override fun onNewIntent(intent: Intent?) { super.onNewIntent(intent) - Handler(mainLooper).postDelayed( { handleBackgroundScan(intent) } , 200) + handleBackgroundScan(intent) } private fun handleBackgroundScan(intent: Intent?) { @@ -88,6 +87,7 @@ class MainActivity : AppCompatActivity() { val tag = intent.getParcelableExtra(NfcAdapter.EXTRA_TAG) if (tag != null) { intent.action = null + store.dispatch(NavigationAction.NavigateTo(AppScreen.Home, false)) store.dispatch(HomeAction.ReadCard) } } diff --git a/app/src/main/java/com/tangem/tap/TapApplication.kt b/app/src/main/java/com/tangem/tap/TapApplication.kt index b19bfc730e..9870dd08bf 100644 --- a/app/src/main/java/com/tangem/tap/TapApplication.kt +++ b/app/src/main/java/com/tangem/tap/TapApplication.kt @@ -1,6 +1,8 @@ package com.tangem.tap import android.app.Application +import com.tangem.tap.common.analytics.AnalyticsHandler +import com.tangem.tap.common.analytics.FirebaseAnalyticsHandler import com.tangem.tap.common.images.PicassoHelper import com.tangem.tap.common.redux.AppState import com.tangem.tap.common.redux.appReducer @@ -16,6 +18,7 @@ val store = Store( state = AppState() ) lateinit var preferencesStorage: PreferencesStorage +lateinit var analytics: AnalyticsHandler class TapApplication : Application() { override fun onCreate() { @@ -26,5 +29,6 @@ class TapApplication : Application() { NetworkConnectivity.createInstance(store, this) preferencesStorage = PreferencesStorage(this) PicassoHelper.initPicassoWithCaching(this) + analytics = FirebaseAnalyticsHandler(this) } } \ No newline at end of file diff --git a/app/src/main/java/com/tangem/tap/common/analytics/AnalyticsEvent.kt b/app/src/main/java/com/tangem/tap/common/analytics/AnalyticsEvent.kt new file mode 100644 index 0000000000..932897e204 --- /dev/null +++ b/app/src/main/java/com/tangem/tap/common/analytics/AnalyticsEvent.kt @@ -0,0 +1,7 @@ +package com.tangem.tap.common.analytics + +enum class AnalyticsEvent(val event: String) { + CARD_IS_SCANNED("card_is_scanned"), + TRANSACTION_IS_SENT("transaction_is_sent"), + READY_TO_SCAN("ready_to_scan"), +} \ No newline at end of file diff --git a/app/src/main/java/com/tangem/tap/common/analytics/AnalyticsHandler.kt b/app/src/main/java/com/tangem/tap/common/analytics/AnalyticsHandler.kt new file mode 100644 index 0000000000..8057bcae9e --- /dev/null +++ b/app/src/main/java/com/tangem/tap/common/analytics/AnalyticsHandler.kt @@ -0,0 +1,7 @@ +package com.tangem.tap.common.analytics + +import com.tangem.commands.Card + +interface AnalyticsHandler { + fun triggerEvent(event: AnalyticsEvent, card: Card?) +} \ No newline at end of file diff --git a/app/src/main/java/com/tangem/tap/common/analytics/FirebaseAnalyticsHandler.kt b/app/src/main/java/com/tangem/tap/common/analytics/FirebaseAnalyticsHandler.kt new file mode 100644 index 0000000000..6118c73cde --- /dev/null +++ b/app/src/main/java/com/tangem/tap/common/analytics/FirebaseAnalyticsHandler.kt @@ -0,0 +1,29 @@ +package com.tangem.tap.common.analytics + +import android.content.Context +import android.os.Bundle +import androidx.core.os.bundleOf +import com.google.firebase.analytics.FirebaseAnalytics +import com.tangem.commands.Card + +class FirebaseAnalyticsHandler(private val context: Context): AnalyticsHandler { + override fun triggerEvent(event: AnalyticsEvent, card: Card?) { + FirebaseAnalytics.getInstance(context) + .logEvent(AnalyticsEvent.CARD_IS_SCANNED.event, setCardData(card)) + } + + private fun setCardData(card: Card?): Bundle { + if (card == null) return bundleOf() + return bundleOf( + AnalyticsParam.BLOCKCHAIN.param to card.cardData?.blockchainName, + AnalyticsParam.BATCH_ID.param to card.cardData?.batchId, + AnalyticsParam.FIRMWARE.param to card.firmwareVersion + ) + } + + private enum class AnalyticsParam(val param: String) { + BLOCKCHAIN("blockchain"), + BATCH_ID("batch_id"), + FIRMWARE("firmware"), + } +} \ No newline at end of file diff --git a/app/src/main/java/com/tangem/tap/common/redux/AppState.kt b/app/src/main/java/com/tangem/tap/common/redux/AppState.kt index d300bb65b7..5f23825839 100644 --- a/app/src/main/java/com/tangem/tap/common/redux/AppState.kt +++ b/app/src/main/java/com/tangem/tap/common/redux/AppState.kt @@ -8,8 +8,8 @@ import com.tangem.tap.features.details.redux.DetailsMiddleware import com.tangem.tap.features.details.redux.DetailsState import com.tangem.tap.features.disclaimer.redux.DisclaimerMiddleware import com.tangem.tap.features.disclaimer.redux.DisclaimerState +import com.tangem.tap.features.home.redux.HomeMiddleware import com.tangem.tap.features.home.redux.HomeState -import com.tangem.tap.features.home.redux.homeMiddleware import com.tangem.tap.features.send.redux.middlewares.sendMiddleware import com.tangem.tap.features.send.redux.states.SendState import com.tangem.tap.features.wallet.redux.WalletState @@ -31,7 +31,7 @@ data class AppState( fun getMiddleware(): List> { return listOf( logMiddleware, navigationMiddleware, notificationsMiddleware, globalMiddleware, - homeMiddleware, walletMiddleware, sendMiddleware, + HomeMiddleware().homeMiddleware, walletMiddleware, sendMiddleware, DetailsMiddleware().detailsMiddleware, DisclaimerMiddleware().disclaimerMiddleware ) 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 d6b7730bcb..a1971bad03 100644 --- a/app/src/main/java/com/tangem/tap/domain/TangemSdkManager.kt +++ b/app/src/main/java/com/tangem/tap/domain/TangemSdkManager.kt @@ -7,6 +7,8 @@ import com.tangem.common.CompletionResult import com.tangem.common.extensions.CardType import com.tangem.common.extensions.calculateSha256 import com.tangem.tangem_sdk_new.extensions.init +import com.tangem.tap.common.analytics.AnalyticsEvent +import com.tangem.tap.common.analytics.AnalyticsHandler import com.tangem.tap.domain.tasks.CreateWalletAndRescanTask import com.tangem.tap.domain.tasks.ScanNoteResponse import com.tangem.tap.domain.tasks.ScanNoteTask @@ -22,7 +24,8 @@ class TangemSdkManager(val activity: ComponentActivity) { activity, Config(cardFilter = CardFilter(EnumSet.allOf(CardType::class.java))) ) - suspend fun scanNote(): CompletionResult { + suspend fun scanNote(analyticsHandler: AnalyticsHandler): CompletionResult { + analyticsHandler.triggerEvent(AnalyticsEvent.READY_TO_SCAN, null) return runTaskAsyncReturnOnMain(ScanNoteTask(), initialMessage = Message(activity.getString(R.string.initial_message_scan_header))) } 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 cea0ea99b2..76d43787eb 100644 --- a/app/src/main/java/com/tangem/tap/domain/TapWalletManager.kt +++ b/app/src/main/java/com/tangem/tap/domain/TapWalletManager.kt @@ -6,6 +6,8 @@ import com.tangem.commands.CardStatus import com.tangem.commands.common.network.Result import com.tangem.common.extensions.toHexString import com.tangem.tap.TapConfig +import com.tangem.tap.analytics +import com.tangem.tap.common.analytics.AnalyticsEvent import com.tangem.tap.common.redux.global.CryptoCurrencyName import com.tangem.tap.common.redux.global.FiatCurrencyName import com.tangem.tap.common.redux.global.GlobalAction @@ -77,7 +79,10 @@ class TapWalletManager { handleFiatRatesResult(results) } - suspend fun onCardScanned(data: ScanNoteResponse) { + suspend fun onCardScanned(data: ScanNoteResponse, addAnalyticsEvent: Boolean = false) { + if (addAnalyticsEvent) { + analytics.triggerEvent(AnalyticsEvent.CARD_IS_SCANNED, data.card) + } tapWorkarounds = TapWorkarounds(data.card) withContext(Dispatchers.Main) { store.dispatch(WalletAction.ResetState) 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 b67c254be3..b35b06f802 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 @@ -4,74 +4,64 @@ import android.content.Intent import android.net.Uri import androidx.core.content.ContextCompat.startActivity import com.tangem.common.CompletionResult +import com.tangem.tap.* import com.tangem.tap.common.redux.AppState import com.tangem.tap.common.redux.global.GlobalAction import com.tangem.tap.common.redux.navigation.AppScreen import com.tangem.tap.common.redux.navigation.NavigationAction -import com.tangem.tap.preferencesStorage -import com.tangem.tap.scope -import com.tangem.tap.store -import com.tangem.tap.tangemSdkManager import kotlinx.coroutines.Dispatchers import kotlinx.coroutines.launch import kotlinx.coroutines.withContext import org.rekotlin.Middleware -val homeMiddleware: Middleware = { dispatch, state -> - { next -> - { action -> - when (action) { - is HomeAction.CheckIfFirstLaunch -> { - store.dispatch( - HomeAction.CheckIfFirstLaunch.Result(preferencesStorage.isFirstLaunch()) - ) - } - is HomeAction.ReadCard -> { - scope.launch { - val result = tangemSdkManager.scanNote() - withContext(Dispatchers.Main) { - when (result) { - is CompletionResult.Success -> { - store.dispatch(GlobalAction.RestoreAppCurrency) - store.state.globalState.tapWalletManager.onCardScanned(result.data) - showDisclaimerOrNavigateToWallet() +class HomeMiddleware { + val homeMiddleware: Middleware = { dispatch, state -> + { next -> + { action -> + when (action) { + is HomeAction.CheckIfFirstLaunch -> { + store.dispatch( + HomeAction.CheckIfFirstLaunch.Result(preferencesStorage.isFirstLaunch()) + ) + } + is HomeAction.ReadCard -> { + scope.launch { + val result = tangemSdkManager.scanNote(analytics) + withContext(Dispatchers.Main) { + when (result) { + is CompletionResult.Success -> { + store.dispatch(GlobalAction.RestoreAppCurrency) + store.state.globalState.tapWalletManager.onCardScanned(result.data) + showDisclaimerOrNavigateToWallet() + } } } } } + is HomeAction.GoToShop -> { + val uri = Uri.parse(CARD_SHOP_URI) + val intent = Intent(Intent.ACTION_VIEW, uri) + startActivity(action.context, intent, null) + } } - is HomeAction.GoToShop -> { - val uri = Uri.parse(CARD_SHOP_URI) - val intent = Intent(Intent.ACTION_VIEW, uri) - startActivity(action.context, intent, null) - } + next(action) } - next(action) } } -} -private fun showDisclaimerOrNavigateToWallet() { - if (preferencesStorage.wasDisclaimerAccepted()) { - navigateToWallet() - } else { - store.dispatch(NavigationAction.NavigateTo(AppScreen.Disclaimer)) - } -} - - -private fun navigateToWallet() { - if (store.state.navigationState.backStack.isNotEmpty()) { - val currentScreen = store.state.navigationState.backStack.last() - if (currentScreen == AppScreen.Home) { - store.dispatch(NavigationAction.NavigateTo(AppScreen.Wallet)) - } else if (currentScreen != AppScreen.Wallet) { - store.dispatch(NavigationAction.PopBackTo(AppScreen.Home)) + private fun showDisclaimerOrNavigateToWallet() { + if (preferencesStorage.wasDisclaimerAccepted()) { store.dispatch(NavigationAction.NavigateTo(AppScreen.Wallet)) + } else { + store.dispatch(NavigationAction.NavigateTo(AppScreen.Disclaimer)) } - } else { - store.dispatch(NavigationAction.NavigateTo(AppScreen.Wallet)) + } + + companion object { + private const val CARD_SHOP_URI = + "https://shop.tangem.com/?afmc=1i&utm_campaign=1i&utm_source=leaddyno&utm_medium=affiliate" } } -private const val CARD_SHOP_URI = "https://shop.tangem.com/?afmc=1i&utm_campaign=1i&utm_source=leaddyno&utm_medium=affiliate" + + 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 03e3ba943c..f0904be965 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 @@ -4,6 +4,9 @@ import com.google.firebase.crashlytics.FirebaseCrashlytics import com.tangem.blockchain.common.* import com.tangem.blockchain.extensions.Result import com.tangem.blockchain.extensions.Signer +import com.tangem.commands.Card +import com.tangem.tap.analytics +import com.tangem.tap.common.analytics.AnalyticsEvent import com.tangem.tap.common.extensions.stripZeroPlainString import com.tangem.tap.common.redux.AppState import com.tangem.tap.common.redux.global.GlobalAction @@ -47,6 +50,7 @@ private fun verifyAndSendTransaction( ) { val sendState = appState?.sendState ?: return val walletManager = appState.globalState.scanNoteResponse?.walletManager ?: return + val card = appState.globalState.scanNoteResponse.card val recipientAddress = sendState.addressPayIdState.recipientWalletAddress ?: return val typedAmount = sendState.amountState.amountToExtract ?: return val feeAmount = sendState.feeState.currentFee ?: return @@ -62,14 +66,14 @@ private fun verifyAndSendTransaction( dispatch(AmountAction.SetAmount(typedAmount.value!!.minus(reduceAmount), false)) dispatch(AmountActionUi.CheckAmountToSend) }, sendAllCallback = { - sendTransaction(action, walletManager, amountToSend, feeAmount, recipientAddress, dispatch) + sendTransaction(action, walletManager, amountToSend, feeAmount, recipientAddress, card, dispatch) }, reduceAmount)) } transactionErrors.isNotEmpty() -> { dispatch(SendAction.SendError(createValidateTransactionError(transactionErrors, walletManager))) } else -> { - sendTransaction(action, walletManager, amountToSend, feeAmount, recipientAddress, dispatch) + sendTransaction(action, walletManager, amountToSend, feeAmount, recipientAddress, card, dispatch) } } } @@ -80,6 +84,7 @@ private fun sendTransaction( amountToSend: Amount, feeAmount: Amount, recipientAddress: String, + card: Card, dispatch: (Action) -> Unit ) { dispatch(SendAction.ChangeSendButtonState(SendButtonState.PROGRESS)) @@ -91,6 +96,7 @@ private fun sendTransaction( withContext(Dispatchers.Main) { when (result) { is Result.Success -> { + analytics.triggerEvent(AnalyticsEvent.TRANSACTION_IS_SENT, card) dispatch(SendAction.SendSuccess) dispatch(GlobalAction.UpdateWalletSignedHashes(result.data.walletSignedHashes)) dispatch(WalletAction.UpdateWallet) 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 125d22f468..5b03acb6da 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 @@ -11,6 +11,7 @@ import com.tangem.common.CompletionResult import com.tangem.common.extensions.CardType import com.tangem.common.extensions.getType import com.tangem.common.extensions.toHexString +import com.tangem.tap.* import com.tangem.tap.common.extensions.copyToClipboard import com.tangem.tap.common.redux.AppState import com.tangem.tap.common.redux.navigation.AppScreen @@ -22,10 +23,6 @@ import com.tangem.tap.features.send.redux.PrepareSendScreen import com.tangem.tap.features.wallet.models.toPendingTransactions import com.tangem.tap.network.NetworkConnectivity import com.tangem.tap.network.NetworkStateChanged -import com.tangem.tap.preferencesStorage -import com.tangem.tap.scope -import com.tangem.tap.store -import com.tangem.tap.tangemSdkManager import kotlinx.coroutines.Dispatchers import kotlinx.coroutines.delay import kotlinx.coroutines.launch @@ -100,10 +97,11 @@ val walletMiddleware: Middleware = { dispatch, state -> } is WalletAction.Scan -> { scope.launch { - val result = tangemSdkManager.scanNote() + val result = tangemSdkManager.scanNote(analytics) when (result) { is CompletionResult.Success -> { - store.state.globalState.tapWalletManager.onCardScanned(result.data) + store.state.globalState.tapWalletManager + .onCardScanned(result.data, true) } } } 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 326d692604..ffd86c6469 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 @@ -53,7 +53,10 @@ private fun internalReduce(action: Action, state: AppState): WalletState { addressData = addressData, currencyData = BalanceWidgetData( status = BalanceStatus.Unreachable, - currency = wallet?.blockchain?.fullName), + currency = wallet?.blockchain?.fullName, + token = wallet?.token?.symbol?.let { + TokenData("", tokenSymbol = it) + }), mainButton = WalletMainButton.SendButton(false) ) } @@ -84,7 +87,10 @@ private fun internalReduce(action: Action, state: AppState): WalletState { cardImage = cardImage, currencyData = BalanceWidgetData( BalanceStatus.Loading, - wallet?.blockchain?.fullName + wallet?.blockchain?.fullName, + token = wallet?.token?.symbol?.let { + TokenData("", tokenSymbol = it) + } ), addressData = addressData, mainButton = WalletMainButton.SendButton(false) 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 65c7679e62..cc65bff46d 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 @@ -8,7 +8,6 @@ import com.tangem.wallet.R import kotlinx.android.synthetic.main.card_balance.* import kotlinx.android.synthetic.main.layout_balance.* import kotlinx.android.synthetic.main.layout_balance_error.* -import kotlinx.android.synthetic.main.layout_token.view.* enum class BalanceStatus { VerifiedOnline, @@ -50,20 +49,21 @@ class BalanceWidget( fragment.l_balance.show() fragment.l_balance_error.hide() fragment.tv_fiat_amount.hide() - fragment.l_token.hide() fragment.tv_currency.text = data.currency fragment.tv_amount.text = "" showStatus(R.id.tv_status_loading) + + if (data.token != null) { + showBalanceWithToken(data, false) + } else { + showBalanceWithoutToken(data, false) + } } BalanceStatus.VerifiedOnline, BalanceStatus.TransactionInProgress -> { fragment.l_balance.show() fragment.l_balance_error.hide() - fragment.tv_currency.text = data.currency - fragment.tv_amount.text = data.amount - fragment.tv_fiat_amount.show() - fragment.tv_fiat_amount.text = data.fiatAmount val statusView = if (data.status == BalanceStatus.VerifiedOnline) { R.id.tv_status_verified } else { @@ -75,22 +75,21 @@ class BalanceWidget( fragment.tv_status_error_message.hide() if (data.token != null) { - fragment.l_token.show() - fragment.l_token.tv_token_symbol.text = data.token.tokenSymbol - fragment.l_token.tv_token_amount.text = data.token.amount - fragment.l_token.tv_token_fiat_amount.text = data.token.fiatAmount + showBalanceWithToken(data, true) } else { - fragment.l_token.hide() + showBalanceWithoutToken(data, true) } } BalanceStatus.Unreachable -> { fragment.l_balance.show() fragment.l_balance_error.hide() - fragment.l_token.hide() fragment.tv_fiat_amount.hide() + fragment.group_base_currency.hide() - fragment.tv_currency.text = data.currency + val currency = if (data.token != null) data.token.tokenSymbol else data.currency + fragment.tv_currency.text = currency fragment.tv_amount.text = "" + fragment.tv_status_error_message.text = data.errorMessage fragment.tv_status_error.text = fragment.getString(R.string.wallet_balance_blockchain_unreachable) @@ -129,4 +128,26 @@ class BalanceWidget( fragment.tv_status_loading.show(viewRes == R.id.tv_status_loading) fragment.tv_status_verified.show(viewRes == R.id.tv_status_verified) } + + private fun showBalanceWithToken(data: BalanceWidgetData, showAmount: Boolean) { + fragment.group_base_currency.show() + fragment.tv_currency.text = data.token?.tokenSymbol + fragment.tv_base_currency.text = data.currency + fragment.tv_amount.text = if (showAmount) data.token?.amount else "" + fragment.tv_base_amount.text = if (showAmount) data.amount else "" + if (showAmount) { + fragment.tv_fiat_amount.show() + fragment.tv_fiat_amount.text = data.token?.fiatAmount + } + } + + private fun showBalanceWithoutToken(data: BalanceWidgetData, showAmount: Boolean) { + fragment.group_base_currency.hide() + fragment.tv_currency.text = data.currency + fragment.tv_amount.text = if (showAmount) data.amount else "" + if (showAmount) { + fragment.tv_fiat_amount.show() + fragment.tv_fiat_amount.text = data.fiatAmount + } + } } \ No newline at end of file diff --git a/app/src/main/res/layout/layout_balance.xml b/app/src/main/res/layout/layout_balance.xml index de3660b802..b4ac0497dd 100644 --- a/app/src/main/res/layout/layout_balance.xml +++ b/app/src/main/res/layout/layout_balance.xml @@ -103,10 +103,10 @@ app:autoSizeMinTextSize="12sp" app:autoSizeStepGranularity="1sp" app:autoSizeTextType="uniform" + app:layout_constraintBottom_toBottomOf="@id/tv_currency" app:layout_constraintEnd_toEndOf="parent" app:layout_constraintHorizontal_weight="1" app:layout_constraintStart_toEndOf="@id/tv_currency" - app:layout_constraintBottom_toBottomOf="@id/tv_currency" tools:text="0.43 BTC" /> + tools:text="USD 3 588" /> - + + + + + app:layout_constraintEnd_toEndOf="parent" + app:layout_constraintHorizontal_bias="1" + app:layout_constraintStart_toEndOf="@id/tv_base_currency" + app:layout_constraintTop_toBottomOf="@id/v_divider" + tools:text="0.00434143 ETH" + /> + + + \ No newline at end of file diff --git a/app/src/main/res/values-v29/styles.xml b/app/src/main/res/values-v29/styles.xml new file mode 100644 index 0000000000..7032bb8f84 --- /dev/null +++ b/app/src/main/res/values-v29/styles.xml @@ -0,0 +1,6 @@ + + + + \ No newline at end of file diff --git a/app/src/main/res/values/styles.xml b/app/src/main/res/values/styles.xml index 61530d2290..03b88ac43d 100644 --- a/app/src/main/res/values/styles.xml +++ b/app/src/main/res/values/styles.xml @@ -1,6 +1,6 @@ - +