diff --git a/app/src/main/java/com/tangem/App.kt b/app/src/main/java/com/tangem/App.kt
index 11f6582f24..b5a4451cb7 100644
--- a/app/src/main/java/com/tangem/App.kt
+++ b/app/src/main/java/com/tangem/App.kt
@@ -2,6 +2,8 @@ package com.tangem
import android.app.Application
import androidx.appcompat.app.AppCompatDelegate
+import com.google.firebase.analytics.FirebaseAnalytics
+import com.google.firebase.crashlytics.FirebaseCrashlytics
import com.google.gson.Gson
import com.google.gson.reflect.TypeToken
import com.tangem.data.dp.PrefsManager
@@ -14,6 +16,7 @@ import com.tangem.server_android.data.LocalStorage
import com.tangem.tangem_card.data.Issuer
import com.tangem.tangem_sdk.android.data.Firmwares
import com.tangem.tangem_sdk.android.data.PINStorage
+import com.tangem.util.Analytics
import com.tangem.wallet.BuildConfig
import java.io.InputStreamReader
import java.nio.charset.StandardCharsets
@@ -76,6 +79,9 @@ class App : Application() {
}
)
}
+
+ FirebaseAnalytics.getInstance(this).setAnalyticsCollectionEnabled(Analytics.isEnabled())
+ FirebaseCrashlytics.getInstance().setCrashlyticsCollectionEnabled(Analytics.isEnabled())
}
private fun buildToastHelperComponent(): ToastHelperComponent {
diff --git a/app/src/main/java/com/tangem/data/dp/PrefsManager.kt b/app/src/main/java/com/tangem/data/dp/PrefsManager.kt
index b616aa5435..598c719e2b 100644
--- a/app/src/main/java/com/tangem/data/dp/PrefsManager.kt
+++ b/app/src/main/java/com/tangem/data/dp/PrefsManager.kt
@@ -3,6 +3,7 @@ package com.tangem.data.dp
import android.annotation.SuppressLint
import android.content.Context
import android.content.SharedPreferences
+import androidx.preference.PreferenceManager
import com.orhanobut.hawk.Hawk
import com.tangem.Constant
import com.tangem.tangem_card.reader.CardCrypto
@@ -10,6 +11,7 @@ import com.tangem.tangem_card.reader.CardCrypto
class PrefsManager {
companion object {
const val PREF_NAME = "tangem_access"
+
@SuppressLint("StaticFieldLeak")
private var instance: PrefsManager? = null
@@ -41,6 +43,11 @@ class PrefsManager {
Hawk.delete(Constant.PREF_LAST_WALLET_ADDRESS)
}
+ fun getSettingsBoolean(key: Int, default: Boolean): Boolean {
+ return PreferenceManager.getDefaultSharedPreferences(context)
+ .getBoolean(context.getString(key), default)
+ }
+
fun appendCid(newCid: String) {
val prevCids: String = Hawk.get("CID_Key", "")
if (!prevCids.contains(newCid)) Hawk.put("CID_Key", "$prevCids$newCid, ")
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 3d1c7163b7..b8a9ddf427 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.analytics.FirebaseAnalytics
import com.google.firebase.crashlytics.FirebaseCrashlytics
import com.tangem.App
import com.tangem.Constant
@@ -47,9 +48,7 @@ import com.tangem.ui.dialog.NoExtendedLengthSupportDialog
import com.tangem.ui.dialog.WaitSecurityDelayDialog
import com.tangem.ui.fragment.pin.PinRequestFragment
import com.tangem.ui.navigation.NavigationResultListener
-import com.tangem.util.CommonUtil
-import com.tangem.util.LOG
-import com.tangem.util.UtilHelper
+import com.tangem.util.*
import com.tangem.util.extensions.colorFrom
import com.tangem.wallet.BuildConfig
import com.tangem.wallet.CoinEngineFactory
@@ -118,6 +117,9 @@ class MainFragment : BaseFragment(), NavigationResultListener, NfcAdapter.Reader
setCardStoreLink()
+
+ FirebaseAnalytics.getInstance(requireActivity())
+ .logEvent(AnalyticsEvent.READY_TO_SCAN.event, bundleOf())
}
private fun setCardStoreLink() {
@@ -271,6 +273,9 @@ class MainFragment : BaseFragment(), NavigationResultListener, NfcAdapter.Reader
val ctx = TangemContext(card)
+ FirebaseAnalytics.getInstance(requireActivity())
+ .logEvent(AnalyticsEvent.CARD_IS_SCANNED.event, Analytics.setCardData(ctx))
+
when {
card.status == TangemCard.Status.Loaded -> lastTag?.let {
val engineCoin = CoinEngineFactory.create(ctx)
diff --git a/app/src/main/java/com/tangem/ui/fragment/SettingsFragment.kt b/app/src/main/java/com/tangem/ui/fragment/SettingsFragment.kt
index 52fa224f03..98b57d7910 100644
--- a/app/src/main/java/com/tangem/ui/fragment/SettingsFragment.kt
+++ b/app/src/main/java/com/tangem/ui/fragment/SettingsFragment.kt
@@ -1,18 +1,24 @@
package com.tangem.ui.fragment
+import android.content.SharedPreferences
import android.os.Bundle
import android.view.View
import androidx.appcompat.app.AppCompatActivity
+import androidx.core.os.bundleOf
import androidx.navigation.fragment.NavHostFragment
import androidx.preference.ListPreference
import androidx.preference.Preference
import androidx.preference.PreferenceCategory
import androidx.preference.PreferenceFragmentCompat
+import com.google.firebase.analytics.FirebaseAnalytics
+import com.google.firebase.crashlytics.FirebaseCrashlytics
+import com.tangem.util.Analytics
+import com.tangem.util.AnalyticsEvent
import com.tangem.wallet.BuildConfig
import com.tangem.wallet.R
import kotlinx.android.synthetic.main.fragment_settings.*
-class SettingsFragment : PreferenceFragmentCompat() {
+class SettingsFragment : PreferenceFragmentCompat(), SharedPreferences.OnSharedPreferenceChangeListener {
override fun onCreatePreferences(savedInstanceState: Bundle?, rootKey: String?) {
addPreferencesFromResource(R.xml.pref_main)
@@ -40,6 +46,32 @@ class SettingsFragment : PreferenceFragmentCompat() {
}
}
+ override fun onSharedPreferenceChanged(sharedPreferences: SharedPreferences?, key: String?) {
+ if (key == getString(R.string.pref_analytics)) {
+ activity?.let {
+ val analytics = FirebaseAnalytics.getInstance(it)
+ if (!Analytics.isEnabled()) {
+ analytics.logEvent(AnalyticsEvent.ANALYTICS_TURNED_OFF.event, bundleOf())
+ }
+ analytics.setAnalyticsCollectionEnabled(Analytics.isEnabled())
+ }
+ FirebaseCrashlytics.getInstance().setCrashlyticsCollectionEnabled(Analytics.isEnabled())
+
+ }
+ }
+
+ override fun onResume() {
+ super.onResume()
+ preferenceScreen.sharedPreferences
+ .registerOnSharedPreferenceChangeListener(this);
+ }
+
+ override fun onPause() {
+ super.onPause()
+ preferenceScreen.sharedPreferences
+ .unregisterOnSharedPreferenceChangeListener(this);
+ }
+
override fun onDestroyView() {
(activity as AppCompatActivity).setSupportActionBar(toolbar)
super.onDestroyView()
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 0a95ebccd5..4de8ee31c8 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,10 +18,8 @@ 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
@@ -49,8 +47,6 @@ 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.*
@@ -133,15 +129,6 @@ 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
index ddca5e506d..c01d40e340 100644
--- a/app/src/main/java/com/tangem/util/Analytics.kt
+++ b/app/src/main/java/com/tangem/util/Analytics.kt
@@ -1,8 +1,18 @@
package com.tangem.util
+import android.os.Bundle
+import androidx.core.os.bundleOf
+import com.tangem.data.dp.PrefsManager
+import com.tangem.wallet.R
+import com.tangem.wallet.TangemContext
+
enum class AnalyticsEvent(val event: String) {
CARD_IS_SCANNED("card_is_scanned"),
TRANSACTION_IS_SENT("transaction_is_sent"),
+ READY_TO_SCAN("ready_to_scan"),
+ READY_TO_SIGN("ready_to_sign"),
+ SIGNED("signed"),
+ ANALYTICS_TURNED_OFF("analytics_turned_off"),
;
}
@@ -12,3 +22,18 @@ enum class AnalyticsParam(val param: String) {
FIRMWARE("firmware"),
;
}
+class Analytics {
+ companion object {
+ fun setCardData(ctx: TangemContext): Bundle {
+ return bundleOf(
+ AnalyticsParam.BLOCKCHAIN.param to ctx.blockchainName,
+ AnalyticsParam.BATCH_ID.param to ctx.card.batch,
+ AnalyticsParam.FIRMWARE.param to ctx.card.firmwareVersion
+ )
+ }
+
+ fun isEnabled(): Boolean {
+ return PrefsManager.getInstance().getSettingsBoolean(R.string.pref_analytics, true)
+ }
+ }
+}
diff --git a/app/src/main/res/values/strings.xml b/app/src/main/res/values/strings.xml
index 39cb7cd948..b3564c1ba5 100644
--- a/app/src/main/res/values/strings.xml
+++ b/app/src/main/res/values/strings.xml
@@ -28,6 +28,7 @@
Settings
Common
Manual editing Fee
+ Collect basic analytics
Encryption modes
- None
diff --git a/app/src/main/res/values/strings_untranslatable.xml b/app/src/main/res/values/strings_untranslatable.xml
index 0b6a2bcf98..419b1c6812 100644
--- a/app/src/main/res/values/strings_untranslatable.xml
+++ b/app/src/main/res/values/strings_untranslatable.xml
@@ -26,6 +26,7 @@
category_common
manual_editing_fee
+ analytics
select_nodes
encryption_modes
diff --git a/app/src/main/res/xml/pref_main.xml b/app/src/main/res/xml/pref_main.xml
index 47be8c9663..e00d77c325 100644
--- a/app/src/main/res/xml/pref_main.xml
+++ b/app/src/main/res/xml/pref_main.xml
@@ -4,11 +4,16 @@
android:key="@string/pref_category_common"
android:title="@string/settings_category_сommon">
-
+
+
diff --git a/app/src/tangemAccess/java/com/tangem/ui/SignTransactionFragment.kt b/app/src/tangemAccess/java/com/tangem/ui/SignTransactionFragment.kt
index c12d49e672..bb5858b8e3 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.analytics.FirebaseAnalytics
import com.google.firebase.crashlytics.FirebaseCrashlytics
import com.tangem.App
import com.tangem.Constant
@@ -27,6 +28,8 @@ import com.tangem.ui.dialog.NoExtendedLengthSupportDialog
import com.tangem.ui.dialog.WaitSecurityDelayDialog
import com.tangem.ui.fragment.BaseFragment
import com.tangem.ui.navigation.NavigationResultListener
+import com.tangem.util.Analytics
+import com.tangem.util.AnalyticsEvent
import com.tangem.util.LOG
import com.tangem.wallet.CoinEngine
import com.tangem.wallet.CoinEngineFactory
@@ -88,6 +91,9 @@ class SignTransactionFragment : BaseFragment(), NavigationResultListener,
tvCardID.text = ctx.card!!.cidDescription
progressBar.progressTintList = ColorStateList.valueOf(Color.DKGRAY)
progressBar.visibility = View.INVISIBLE
+
+ FirebaseAnalytics.getInstance(requireActivity())
+ .logEvent(AnalyticsEvent.READY_TO_SIGN.event, Analytics.setCardData(ctx))
}
override fun onPause() {
@@ -175,6 +181,10 @@ class SignTransactionFragment : BaseFragment(), NavigationResultListener,
signTransactionTask = null
if (cardProtocol != null) {
if (cardProtocol.error == null) {
+
+ FirebaseAnalytics.getInstance(requireActivity())
+ .logEvent(AnalyticsEvent.SIGNED.event, Analytics.setCardData(ctx))
+
rlProgressBar?.post { rlProgressBar?.visibility = View.GONE }
progressBar?.post {