diff --git a/app/src/main/java/com/tangem/ui/fragment/MainFragment.kt b/app/src/main/java/com/tangem/ui/fragment/MainFragment.kt index a594c110a8..3d1c7163b7 100644 --- a/app/src/main/java/com/tangem/ui/fragment/MainFragment.kt +++ b/app/src/main/java/com/tangem/ui/fragment/MainFragment.kt @@ -20,6 +20,7 @@ import android.widget.Toast import androidx.appcompat.app.AppCompatActivity import androidx.core.os.bundleOf import androidx.lifecycle.ViewModelProviders +import com.google.firebase.crashlytics.FirebaseCrashlytics import com.tangem.App import com.tangem.Constant import com.tangem.data.Blockchain @@ -315,6 +316,7 @@ class MainFragment : BaseFragment(), NavigationResultListener, NfcAdapter.Reader } } else { + FirebaseCrashlytics.getInstance().recordException(cardProtocol.error) // remove last UIDs because of error and no card read rlProgressBar.post { context?.let { Toast.makeText(it, R.string.general_notification_scan_again, Toast.LENGTH_SHORT).show() } diff --git a/app/src/main/java/com/tangem/ui/fragment/PurgeFragment.kt b/app/src/main/java/com/tangem/ui/fragment/PurgeFragment.kt index dc12ed4860..76d8d97dc6 100644 --- a/app/src/main/java/com/tangem/ui/fragment/PurgeFragment.kt +++ b/app/src/main/java/com/tangem/ui/fragment/PurgeFragment.kt @@ -12,6 +12,7 @@ import android.os.Bundle import android.view.View import android.widget.Toast import androidx.core.os.bundleOf +import com.google.firebase.crashlytics.FirebaseCrashlytics import com.tangem.App import com.tangem.Constant import com.tangem.tangem_card.reader.CardProtocol @@ -151,6 +152,7 @@ class PurgeFragment : BaseFragment(), NfcAdapter.ReaderCallback, CardProtocol.No navigateToDestination(R.id.action_purgeFragment_to_mainFragment) } } else { + FirebaseCrashlytics.getInstance().recordException(cardProtocol.error) if (cardProtocol.error is CardProtocol.TangemException_InvalidPIN) { progressBar?.post { progressBar?.progress = 100 diff --git a/app/src/main/java/com/tangem/ui/fragment/SendTransactionFragment.kt b/app/src/main/java/com/tangem/ui/fragment/SendTransactionFragment.kt index 7d709ee662..7365324d29 100644 --- a/app/src/main/java/com/tangem/ui/fragment/SendTransactionFragment.kt +++ b/app/src/main/java/com/tangem/ui/fragment/SendTransactionFragment.kt @@ -6,11 +6,15 @@ import android.nfc.Tag import android.os.Bundle import android.widget.Toast import androidx.activity.OnBackPressedCallback +import androidx.core.os.bundleOf +import com.google.firebase.analytics.FirebaseAnalytics import com.tangem.App import com.tangem.Constant import com.tangem.tangem_card.util.Util import com.tangem.ui.activity.MainActivity import com.tangem.ui.event.TransactionFinishWithSuccess +import com.tangem.util.AnalyticsEvent +import com.tangem.util.AnalyticsParam import com.tangem.util.UtilHelper import com.tangem.wallet.CoinEngine import com.tangem.wallet.CoinEngineFactory @@ -40,7 +44,7 @@ class SendTransactionFragment : BaseFragment(), NfcAdapter.ReaderCallback { if (success) { App.pendingTransactionsStorage.putTransaction(ctx.card, Util.bytesToHex(tx), engine.pendingTransactionTimeoutInSeconds()) finishWithSuccess() - }else + } else finishWithError(ctx.error) } @@ -75,6 +79,11 @@ class SendTransactionFragment : BaseFragment(), NfcAdapter.ReaderCallback { val transactionFinishWithSuccess = TransactionFinishWithSuccess() EventBus.getDefault().post(transactionFinishWithSuccess) + activity?.let { + val params = bundleOf(AnalyticsParam.BLOCKCHAIN.param to ctx.blockchainName) + FirebaseAnalytics.getInstance(it).logEvent(AnalyticsEvent.TRANSACTION_IS_SENT.event, params) + } + val data = Bundle() data.putString(Constant.EXTRA_MESSAGE, getString(R.string.send_transaction_success)) navigateBackWithResult(Activity.RESULT_OK, data, R.id.loadedWalletFragment) diff --git a/app/src/main/java/com/tangem/ui/fragment/id/IdFragment.kt b/app/src/main/java/com/tangem/ui/fragment/id/IdFragment.kt index 7c8ec384e4..8013e66fed 100644 --- a/app/src/main/java/com/tangem/ui/fragment/id/IdFragment.kt +++ b/app/src/main/java/com/tangem/ui/fragment/id/IdFragment.kt @@ -12,6 +12,7 @@ import android.view.View import android.widget.Toast import androidx.appcompat.app.AppCompatActivity import androidx.core.content.ContextCompat +import com.google.firebase.crashlytics.FirebaseCrashlytics import com.tangem.App import com.tangem.Constant import com.tangem.data.Blockchain @@ -26,7 +27,6 @@ import com.tangem.ui.activity.MainActivity import com.tangem.ui.dialog.NoExtendedLengthSupportDialog import com.tangem.ui.dialog.WaitSecurityDelayDialog import com.tangem.ui.fragment.BaseFragment -import com.tangem.ui.fragment.wallet.LoadedWalletViewModel import com.tangem.util.LOG import com.tangem.util.UtilHelper import com.tangem.wallet.* @@ -232,6 +232,7 @@ class IdFragment : BaseFragment(), NfcAdapter.ReaderCallback, } } else { // remove last UIDs because of error and no card read + FirebaseCrashlytics.getInstance().recordException(cardProtocol.error) rlProgressBar?.post { lastReadSuccess = false if (cardProtocol.error is CardProtocol.TangemException_ExtendedLengthNotSupported) diff --git a/app/src/main/java/com/tangem/ui/fragment/id/ValidateIdFragment.kt b/app/src/main/java/com/tangem/ui/fragment/id/ValidateIdFragment.kt index 04812351c0..2eed027cf3 100644 --- a/app/src/main/java/com/tangem/ui/fragment/id/ValidateIdFragment.kt +++ b/app/src/main/java/com/tangem/ui/fragment/id/ValidateIdFragment.kt @@ -11,12 +11,12 @@ import android.os.Bundle import android.view.View import android.widget.Toast import androidx.activity.OnBackPressedCallback +import com.google.firebase.crashlytics.FirebaseCrashlytics import com.tangem.App import com.tangem.Constant import com.tangem.tangem_card.data.TangemCard import com.tangem.tangem_card.reader.CardProtocol import com.tangem.tangem_card.tasks.OneTouchSignTask -import com.tangem.tangem_card.tasks.SignTask import com.tangem.tangem_card.util.Util import com.tangem.tangem_sdk.android.data.PINStorage import com.tangem.tangem_sdk.android.nfc.NfcDeviceAntennaLocation @@ -24,7 +24,6 @@ import com.tangem.tangem_sdk.android.reader.NfcReader import com.tangem.tangem_sdk.data.EXTRA_TANGEM_CARD import com.tangem.tangem_sdk.data.EXTRA_TANGEM_CARD_UID import com.tangem.tangem_sdk.data.asBundle -import com.tangem.ui.SignTransactionFragment import com.tangem.ui.activity.MainActivity import com.tangem.ui.dialog.NoExtendedLengthSupportDialog import com.tangem.ui.dialog.WaitSecurityDelayDialog @@ -223,6 +222,7 @@ class ValidateIdFragment : BaseFragment(), NavigationResultListener, mpFinishSignSound.start() } else { + FirebaseCrashlytics.getInstance().recordException(cardProtocol.error) lastReadSuccess = false if (cardProtocol.error.javaClass == CardProtocol.TangemException_InvalidPIN::class.java) { progressBar?.post { diff --git a/app/src/main/java/com/tangem/ui/fragment/id/WriteIdFragment.kt b/app/src/main/java/com/tangem/ui/fragment/id/WriteIdFragment.kt index 5b0235f356..3df0850220 100644 --- a/app/src/main/java/com/tangem/ui/fragment/id/WriteIdFragment.kt +++ b/app/src/main/java/com/tangem/ui/fragment/id/WriteIdFragment.kt @@ -11,6 +11,7 @@ import android.os.Bundle import android.view.View import android.widget.Toast import androidx.activity.OnBackPressedCallback +import com.google.firebase.crashlytics.FirebaseCrashlytics import com.tangem.App import com.tangem.Constant import com.tangem.tangem_card.reader.CardProtocol @@ -190,6 +191,7 @@ class WriteIdFragment : BaseFragment(), NavigationResultListener, } else { lastReadSuccess = false + FirebaseCrashlytics.getInstance().recordException(cardProtocol.error) if (cardProtocol.error.javaClass == CardProtocol.TangemException_InvalidPIN::class.java) { progressBar?.post { progressBar?.progress = 100 diff --git a/app/src/main/java/com/tangem/ui/fragment/pin/PinSwapFragment.kt b/app/src/main/java/com/tangem/ui/fragment/pin/PinSwapFragment.kt index 04b12813ba..ee846c13ca 100644 --- a/app/src/main/java/com/tangem/ui/fragment/pin/PinSwapFragment.kt +++ b/app/src/main/java/com/tangem/ui/fragment/pin/PinSwapFragment.kt @@ -10,6 +10,7 @@ import android.os.Bundle import android.view.View import android.widget.ProgressBar import android.widget.Toast +import com.google.firebase.crashlytics.FirebaseCrashlytics import com.tangem.App import com.tangem.Constant import com.tangem.tangem_card.data.TangemCard @@ -112,6 +113,7 @@ class PinSwapFragment : BaseFragment(), NfcAdapter.ReaderCallback, CardProtocol. swapPinTask = null if (cardProtocol != null) { + cardProtocol.error?.let { FirebaseCrashlytics.getInstance().recordException(it) } when { cardProtocol.error == null -> progressBar!!.post { progressBar!!.progress = 100 diff --git a/app/src/main/java/com/tangem/ui/fragment/wallet/CreateNewWalletFragment.kt b/app/src/main/java/com/tangem/ui/fragment/wallet/CreateNewWalletFragment.kt index 5496044e70..51e9ef4544 100644 --- a/app/src/main/java/com/tangem/ui/fragment/wallet/CreateNewWalletFragment.kt +++ b/app/src/main/java/com/tangem/ui/fragment/wallet/CreateNewWalletFragment.kt @@ -9,6 +9,7 @@ import android.nfc.tech.IsoDep import android.os.Bundle import android.view.View import android.widget.Toast +import com.google.firebase.crashlytics.FirebaseCrashlytics import com.tangem.App import com.tangem.Constant import com.tangem.tangem_card.reader.CardProtocol @@ -101,6 +102,7 @@ class CreateNewWalletFragment : BaseFragment(), NfcAdapter.ReaderCallback, CardP return@post } } else { + FirebaseCrashlytics.getInstance().recordException(cardProtocol.error) lastReadSuccess = false if (cardProtocol.error is CardProtocol.TangemException_InvalidPIN) { progressBar?.post { diff --git a/app/src/main/java/com/tangem/ui/fragment/wallet/EmptyWalletFragment.kt b/app/src/main/java/com/tangem/ui/fragment/wallet/EmptyWalletFragment.kt index 65461743c6..e8a4cc7542 100644 --- a/app/src/main/java/com/tangem/ui/fragment/wallet/EmptyWalletFragment.kt +++ b/app/src/main/java/com/tangem/ui/fragment/wallet/EmptyWalletFragment.kt @@ -13,6 +13,7 @@ import android.os.Bundle import android.text.Html import android.view.View import android.widget.Toast +import com.google.firebase.crashlytics.FirebaseCrashlytics import com.tangem.App import com.tangem.Constant import com.tangem.tangem_card.data.TangemCard @@ -181,6 +182,7 @@ class EmptyWalletFragment : BaseFragment(), NavigationResultListener, this.cardProtocol = cardProtocol } } else { + FirebaseCrashlytics.getInstance().recordException(cardProtocol.error) // remove last UIDs because of error and no card read progressBar?.post { lastReadSuccess = false diff --git a/app/src/main/java/com/tangem/ui/fragment/wallet/LoadedWalletFragment.kt b/app/src/main/java/com/tangem/ui/fragment/wallet/LoadedWalletFragment.kt index 4de8ee31c8..0a95ebccd5 100644 --- a/app/src/main/java/com/tangem/ui/fragment/wallet/LoadedWalletFragment.kt +++ b/app/src/main/java/com/tangem/ui/fragment/wallet/LoadedWalletFragment.kt @@ -18,8 +18,10 @@ import android.view.View import android.widget.Toast import androidx.appcompat.app.AppCompatActivity import androidx.core.content.ContextCompat +import androidx.core.os.bundleOf import androidx.lifecycle.Observer import androidx.lifecycle.ViewModelProviders +import com.google.firebase.analytics.FirebaseAnalytics import com.tangem.App import com.tangem.Constant import com.tangem.data.Blockchain @@ -47,6 +49,8 @@ import com.tangem.ui.fragment.BaseFragment import com.tangem.ui.fragment.pin.PinRequestFragment import com.tangem.ui.fragment.pin.PinSwapFragment import com.tangem.ui.navigation.NavigationResultListener +import com.tangem.util.AnalyticsEvent +import com.tangem.util.AnalyticsParam import com.tangem.util.LOG import com.tangem.util.UtilHelper import com.tangem.wallet.* @@ -129,6 +133,15 @@ class LoadedWalletFragment : BaseFragment(), NavigationResultListener, NfcAdapte override fun onViewCreated(view: View, savedInstanceState: Bundle?) { super.onViewCreated(view, savedInstanceState) + + val params = bundleOf( + AnalyticsParam.BLOCKCHAIN.param to ctx.blockchainName, + AnalyticsParam.BATCH_ID.param to ctx.card.batch, + AnalyticsParam.FIRMWARE.param to ctx.card.firmwareVersion + ) + FirebaseAnalytics.getInstance(requireActivity()) + .logEvent(AnalyticsEvent.CARD_IS_SCANNED.event, params) + mpSecondScanSound = MediaPlayer.create(activity, R.raw.scan_card_sound) val engine = CoinEngineFactory.create(ctx) diff --git a/app/src/main/java/com/tangem/util/Analytics.kt b/app/src/main/java/com/tangem/util/Analytics.kt new file mode 100644 index 0000000000..ddca5e506d --- /dev/null +++ b/app/src/main/java/com/tangem/util/Analytics.kt @@ -0,0 +1,14 @@ +package com.tangem.util + +enum class AnalyticsEvent(val event: String) { + CARD_IS_SCANNED("card_is_scanned"), + TRANSACTION_IS_SENT("transaction_is_sent"), + ; +} + +enum class AnalyticsParam(val param: String) { + BLOCKCHAIN("blockchain"), + BATCH_ID("batch_id"), + FIRMWARE("firmware"), + ; +} diff --git a/app/src/main/java/com/tangem/wallet/TangemContext.java b/app/src/main/java/com/tangem/wallet/TangemContext.java index df164a4616..a027d33f3b 100644 --- a/app/src/main/java/com/tangem/wallet/TangemContext.java +++ b/app/src/main/java/com/tangem/wallet/TangemContext.java @@ -4,10 +4,12 @@ import android.content.Context; import android.content.Intent; import android.os.Bundle; +import com.google.firebase.crashlytics.FirebaseCrashlytics; import com.tangem.Constant; import com.tangem.data.Blockchain; import com.tangem.tangem_card.data.TangemCard; import com.tangem.tangem_sdk.data.TangemCardExtensionsKt; +import com.tangem.util.AnalyticsParam; public class TangemContext { // public static final String EXTRA_BLOCKCHAIN_DATA = "BLOCKCHAIN_DATA"; @@ -58,7 +60,7 @@ public class TangemContext { public String getBlockchainName() { Blockchain blockchain = getBlockchain(); if (blockchain == Blockchain.Token || blockchain == Blockchain.RootstockToken) { - return card.getTokenSymbol()+ "
" + getBlockchain().getOfficialName() + " smart contract token"; + return card.getTokenSymbol() + "
" + getBlockchain().getOfficialName() + " smart contract token"; } if (blockchain == Blockchain.NftToken) { return card.getTokenSymbol().substring(4) + "
" + getBlockchain().getOfficialName() + " non-fungible token"; @@ -67,7 +69,7 @@ public class TangemContext { return card.getTokenSymbol() + "
" + getBlockchain().getOfficialName() + " asset"; } if (blockchain == Blockchain.StellarTag) { - return "TANGEM TAG
"+ getBlockchain().getOfficialName() + " non-fungible token "; + return "TANGEM TAG
" + getBlockchain().getOfficialName() + " non-fungible token "; } return blockchain.getOfficialName(); } @@ -97,6 +99,11 @@ public class TangemContext { } public void setError(String error) { + if (error != null) { + FirebaseCrashlytics crashlytics = FirebaseCrashlytics.getInstance(); + crashlytics.setCustomKey(AnalyticsParam.BLOCKCHAIN.getParam(), getBlockchainName()); + crashlytics.recordException(new Exception(error)); + } this.error = error; } diff --git a/app/src/tangemAccess/java/com/tangem/ui/SignTransactionFragment.kt b/app/src/tangemAccess/java/com/tangem/ui/SignTransactionFragment.kt index 8429ec1e2e..c12d49e672 100644 --- a/app/src/tangemAccess/java/com/tangem/ui/SignTransactionFragment.kt +++ b/app/src/tangemAccess/java/com/tangem/ui/SignTransactionFragment.kt @@ -11,6 +11,7 @@ import android.os.Bundle import android.view.View import android.widget.Toast import androidx.activity.OnBackPressedCallback +import com.google.firebase.crashlytics.FirebaseCrashlytics import com.tangem.App import com.tangem.Constant import com.tangem.tangem_card.reader.CardProtocol @@ -34,7 +35,6 @@ import com.tangem.wallet.TangemContext import kotlinx.android.synthetic.main.layout_progress_horizontal.* import kotlinx.android.synthetic.main.layout_touch_card.* import kotlinx.android.synthetic.tangemAccess.fragment_sign_transaction.* -import java.lang.IllegalArgumentException class SignTransactionFragment : BaseFragment(), NavigationResultListener, @@ -185,6 +185,7 @@ class SignTransactionFragment : BaseFragment(), NavigationResultListener, mpFinishSignSound.start() } else { lastReadSuccess = false + FirebaseCrashlytics.getInstance().recordException(cardProtocol.error) if (cardProtocol.error.javaClass == CardProtocol.TangemException_InvalidPIN::class.java) { progressBar?.post { progressBar?.progress = 100