diff --git a/app/build.gradle b/app/build.gradle index bbc6458..7287c67 100644 --- a/app/build.gradle +++ b/app/build.gradle @@ -3,8 +3,8 @@ apply plugin: 'kotlin-android' apply plugin: 'kotlin-android-extensions' apply plugin: 'kotlin-kapt' apply plugin: "androidx.navigation.safeargs.kotlin" -apply plugin: 'io.fabric' apply plugin: 'com.google.gms.google-services' +apply plugin: 'com.google.firebase.crashlytics' // Needed for Kotlin's @Parcelize annotation androidExtensions { @@ -32,17 +32,14 @@ android { } } buildTypes { + debug { + minifyEnabled false + resValue("string", "PORT_NUMBER", "8082") + } release { minifyEnabled true shrinkResources true proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro' - // enable crashlytics - ext.enableCrashlytics = true - } - debug { - resValue("string", "PORT_NUMBER", "8082") - // disable crashlytics - ext.enableCrashlytics = false } } android.packagingOptions { @@ -109,8 +106,8 @@ dependencies { implementation 'com.squareup.okhttp3:logging-interceptor:4.2.0' implementation 'com.jakewharton.retrofit:retrofit2-rxjava2-adapter:1.0.0' //Firebase - implementation 'com.google.firebase:firebase-core:17.2.1' - implementation 'com.crashlytics.sdk.android:crashlytics:2.10.1' + implementation 'com.google.firebase:firebase-analytics:18.0.0' + implementation 'com.google.firebase:firebase-crashlytics:17.3.0' // CSV generation implementation 'com.opencsv:opencsv:3.7' // Others diff --git a/app/proguard-rules.pro b/app/proguard-rules.pro index a0f609e..6a67c81 100644 --- a/app/proguard-rules.pro +++ b/app/proguard-rules.pro @@ -132,9 +132,8 @@ ##--------------- proguard configuration for Crashlytics ---------- # source https://firebase.google.com/docs/crashlytics/get-deobfuscated-reports?platform=android --keepattributes *Annotation* # Keep Crashlytics annotations --keepattributes SourceFile,LineNumberTable # Keep file names/line numbers --keep public class * extends java.lang.Exception # Keep custom exceptions (opt) +-keepattributes SourceFile,LineNumberTable # Keep file names and line numbers. +-keep public class * extends java.lang.Exception # Optional: Keep custom exceptions. ##--------------- proguard configuration for Coroutines ---------- diff --git a/app/src/main/AndroidManifest.xml b/app/src/main/AndroidManifest.xml index 2b2be10..b2fe2a8 100644 --- a/app/src/main/AndroidManifest.xml +++ b/app/src/main/AndroidManifest.xml @@ -24,8 +24,8 @@ android:value="@string/google_maps_key"/> + android:name="firebase_crashlytics_collection_enabled" + android:value="false" /> 500 ms mDisposables.add( @@ -93,7 +94,7 @@ class ImportBrainkeyFragment : BaseAccountFragment() { .observeOn(AndroidSchedulers.mainThread()) .subscribe( { validatePIN() }, - { Crashlytics.log(Log.DEBUG, TAG, it.message) } + { crashlytics.log("D/$TAG: ${it.message}") } ) ) @@ -105,7 +106,7 @@ class ImportBrainkeyFragment : BaseAccountFragment() { .observeOn(AndroidSchedulers.mainThread()) .subscribe( { validatePINConfirmation() }, - { Crashlytics.log(Log.DEBUG, TAG, it.message) } + { crashlytics.log("D/$TAG: ${it.message}") } ) ) @@ -118,7 +119,7 @@ class ImportBrainkeyFragment : BaseAccountFragment() { .observeOn(AndroidSchedulers.mainThread()) .subscribe( { validateBrainKey(it) }, - { Crashlytics.log(Log.DEBUG, TAG, it.message) } + { crashlytics.log("D/$TAG: ${it.message}") } ) ) diff --git a/app/src/main/java/cy/agorise/bitsybitshareswallet/fragments/LicenseFragment.kt b/app/src/main/java/cy/agorise/bitsybitshareswallet/fragments/LicenseFragment.kt index 368d24a..6fa29e4 100644 --- a/app/src/main/java/cy/agorise/bitsybitshareswallet/fragments/LicenseFragment.kt +++ b/app/src/main/java/cy/agorise/bitsybitshareswallet/fragments/LicenseFragment.kt @@ -8,7 +8,7 @@ import android.view.ViewGroup import androidx.appcompat.widget.Toolbar import androidx.fragment.app.Fragment import androidx.navigation.fragment.findNavController -import com.crashlytics.android.Crashlytics +import com.google.firebase.crashlytics.FirebaseCrashlytics import cy.agorise.bitsybitshareswallet.R import cy.agorise.bitsybitshareswallet.utils.Constants import kotlinx.android.synthetic.main.fragment_license.* @@ -30,7 +30,8 @@ class LicenseFragment : Fragment() { override fun onViewCreated(view: View, savedInstanceState: Bundle?) { super.onViewCreated(view, savedInstanceState) - Crashlytics.setString(Constants.CRASHLYTICS_KEY_LAST_SCREEN, TAG) + val crashlytics = FirebaseCrashlytics.getInstance() + crashlytics.setCustomKey(Constants.CRASHLYTICS_KEY_LAST_SCREEN, TAG) // Get version number of the last agreed license version val agreedLicenseVersion = PreferenceManager.getDefaultSharedPreferences(context) diff --git a/app/src/main/java/cy/agorise/bitsybitshareswallet/fragments/MerchantsFragment.kt b/app/src/main/java/cy/agorise/bitsybitshareswallet/fragments/MerchantsFragment.kt index 7b5bb82..b27ea01 100644 --- a/app/src/main/java/cy/agorise/bitsybitshareswallet/fragments/MerchantsFragment.kt +++ b/app/src/main/java/cy/agorise/bitsybitshareswallet/fragments/MerchantsFragment.kt @@ -22,7 +22,6 @@ import androidx.lifecycle.Observer import androidx.lifecycle.ViewModelProviders import com.afollestad.materialdialogs.MaterialDialog import com.afollestad.materialdialogs.customview.customView -import com.crashlytics.android.Crashlytics import com.google.android.gms.maps.CameraUpdateFactory import com.google.android.gms.maps.GoogleMap import com.google.android.gms.maps.OnMapReadyCallback @@ -31,6 +30,7 @@ import com.google.android.gms.maps.model.LatLng import com.google.android.gms.maps.model.LatLngBounds import com.google.android.gms.maps.model.MapStyleOptions import com.google.android.gms.maps.model.Marker +import com.google.firebase.crashlytics.FirebaseCrashlytics import com.google.maps.android.MarkerManager import com.google.maps.android.clustering.Cluster import com.google.maps.android.clustering.ClusterItem @@ -124,7 +124,8 @@ class MerchantsFragment : Fragment(), OnMapReadyCallback, SearchView.OnSuggestio override fun onViewCreated(view: View, savedInstanceState: Bundle?) { super.onViewCreated(view, savedInstanceState) - Crashlytics.setString(Constants.CRASHLYTICS_KEY_LAST_SCREEN, TAG) + val crashlytics = FirebaseCrashlytics.getInstance() + crashlytics.setCustomKey(Constants.CRASHLYTICS_KEY_LAST_SCREEN, TAG) // Dynamically obtain status bar and navigation bar heights, and account for the status bar height to add // the correct top margin to the Toolbar and place it just below the status bar diff --git a/app/src/main/java/cy/agorise/bitsybitshareswallet/fragments/PINSecurityLockDialog.kt b/app/src/main/java/cy/agorise/bitsybitshareswallet/fragments/PINSecurityLockDialog.kt index 1b53926..ec2eeb2 100644 --- a/app/src/main/java/cy/agorise/bitsybitshareswallet/fragments/PINSecurityLockDialog.kt +++ b/app/src/main/java/cy/agorise/bitsybitshareswallet/fragments/PINSecurityLockDialog.kt @@ -7,7 +7,7 @@ import android.view.View import android.view.ViewGroup import android.view.WindowManager import android.view.inputmethod.EditorInfo -import com.crashlytics.android.Crashlytics +import com.google.firebase.crashlytics.FirebaseCrashlytics import com.jakewharton.rxbinding3.widget.textChanges import cy.agorise.bitsybitshareswallet.R import cy.agorise.bitsybitshareswallet.utils.Constants @@ -35,7 +35,8 @@ class PINSecurityLockDialog : BaseSecurityLockDialog() { override fun onViewCreated(view: View, savedInstanceState: Bundle?) { super.onViewCreated(view, savedInstanceState) - Crashlytics.setString(Constants.CRASHLYTICS_KEY_LAST_SCREEN, TAG) + val crashlytics = FirebaseCrashlytics.getInstance() + crashlytics.setCustomKey(Constants.CRASHLYTICS_KEY_LAST_SCREEN, TAG) // Request focus to the PIN EditText and automatically show the keyboard when the dialog appears. tietPIN.requestFocus() diff --git a/app/src/main/java/cy/agorise/bitsybitshareswallet/fragments/PatternSecurityLockDialog.kt b/app/src/main/java/cy/agorise/bitsybitshareswallet/fragments/PatternSecurityLockDialog.kt index b28607e..26d193c 100644 --- a/app/src/main/java/cy/agorise/bitsybitshareswallet/fragments/PatternSecurityLockDialog.kt +++ b/app/src/main/java/cy/agorise/bitsybitshareswallet/fragments/PatternSecurityLockDialog.kt @@ -9,7 +9,7 @@ import cy.agorise.bitsybitshareswallet.R import kotlinx.android.synthetic.main.dialog_pattern_security_lock.* import com.andrognito.patternlockview.PatternLockView import com.andrognito.patternlockview.listener.PatternLockViewListener -import com.crashlytics.android.Crashlytics +import com.google.firebase.crashlytics.FirebaseCrashlytics import cy.agorise.bitsybitshareswallet.utils.Constants import cy.agorise.bitsybitshareswallet.utils.CryptoUtils @@ -33,7 +33,8 @@ class PatternSecurityLockDialog : BaseSecurityLockDialog() { override fun onViewCreated(view: View, savedInstanceState: Bundle?) { super.onViewCreated(view, savedInstanceState) - Crashlytics.setString(Constants.CRASHLYTICS_KEY_LAST_SCREEN, TAG) + val crashlytics = FirebaseCrashlytics.getInstance() + crashlytics.setCustomKey(Constants.CRASHLYTICS_KEY_LAST_SCREEN, TAG) setupScreen() diff --git a/app/src/main/java/cy/agorise/bitsybitshareswallet/fragments/ReceiveTransactionFragment.kt b/app/src/main/java/cy/agorise/bitsybitshareswallet/fragments/ReceiveTransactionFragment.kt index 4f63f78..6dc425a 100644 --- a/app/src/main/java/cy/agorise/bitsybitshareswallet/fragments/ReceiveTransactionFragment.kt +++ b/app/src/main/java/cy/agorise/bitsybitshareswallet/fragments/ReceiveTransactionFragment.kt @@ -13,8 +13,8 @@ import androidx.collection.LongSparseArray import androidx.core.content.ContextCompat import androidx.lifecycle.Observer import androidx.lifecycle.ViewModelProviders -import com.crashlytics.android.Crashlytics import com.google.common.primitives.UnsignedLong +import com.google.firebase.crashlytics.FirebaseCrashlytics import com.jakewharton.rxbinding3.widget.textChanges import cy.agorise.bitsybitshareswallet.R import cy.agorise.bitsybitshareswallet.adapters.AssetsAdapter @@ -100,7 +100,8 @@ class ReceiveTransactionFragment : ConnectedFragment() { override fun onViewCreated(view: View, savedInstanceState: Bundle?) { super.onViewCreated(view, savedInstanceState) - Crashlytics.setString(Constants.CRASHLYTICS_KEY_LAST_SCREEN, TAG) + val crashlytics = FirebaseCrashlytics.getInstance() + crashlytics.setCustomKey(Constants.CRASHLYTICS_KEY_LAST_SCREEN, TAG) // Configure ViewModel mViewModel = ViewModelProviders.of(this).get(ReceiveTransactionViewModel::class.java) @@ -286,7 +287,7 @@ class ReceiveTransactionFragment : ConnectedFragment() { updateAmountAddressUI(amount, asset.symbol, asset.precision, mUserAccount!!.name) } catch (e: NullPointerException) { Log.e(TAG, "NullPointerException. Msg: " + e.message) - Crashlytics.logException(e) + FirebaseCrashlytics.getInstance().recordException(e) } } diff --git a/app/src/main/java/cy/agorise/bitsybitshareswallet/fragments/SendTransactionFragment.kt b/app/src/main/java/cy/agorise/bitsybitshareswallet/fragments/SendTransactionFragment.kt index 36016fe..cc4ec26 100644 --- a/app/src/main/java/cy/agorise/bitsybitshareswallet/fragments/SendTransactionFragment.kt +++ b/app/src/main/java/cy/agorise/bitsybitshareswallet/fragments/SendTransactionFragment.kt @@ -18,9 +18,9 @@ import androidx.navigation.fragment.findNavController import androidx.navigation.fragment.navArgs import com.afollestad.materialdialogs.MaterialDialog import com.afollestad.materialdialogs.customview.customView -import com.crashlytics.android.Crashlytics import com.google.android.material.snackbar.Snackbar import com.google.common.primitives.UnsignedLong +import com.google.firebase.crashlytics.FirebaseCrashlytics import com.google.zxing.BarcodeFormat import com.google.zxing.Result import com.jakewharton.rxbinding3.widget.textChanges @@ -137,7 +137,8 @@ class SendTransactionFragment : ConnectedFragment(), ZXingScannerView.ResultHand override fun onViewCreated(view: View, savedInstanceState: Bundle?) { super.onViewCreated(view, savedInstanceState) - Crashlytics.setString(Constants.CRASHLYTICS_KEY_LAST_SCREEN, TAG) + val crashlytics = FirebaseCrashlytics.getInstance() + crashlytics.setCustomKey(Constants.CRASHLYTICS_KEY_LAST_SCREEN, TAG) val userId = PreferenceManager.getDefaultSharedPreferences(context) .getString(Constants.KEY_CURRENT_ACCOUNT_ID, "") ?: "" @@ -154,7 +155,7 @@ class SendTransactionFragment : ConnectedFragment(), ZXingScannerView.ResultHand try { wifKey = CryptoUtils.decrypt(it, encryptedWIF) } catch (e: Exception) { - Crashlytics.logException(e) + crashlytics.recordException(e) } } }) diff --git a/app/src/main/java/cy/agorise/bitsybitshareswallet/fragments/SettingsFragment.kt b/app/src/main/java/cy/agorise/bitsybitshareswallet/fragments/SettingsFragment.kt index 9256def..1d74838 100644 --- a/app/src/main/java/cy/agorise/bitsybitshareswallet/fragments/SettingsFragment.kt +++ b/app/src/main/java/cy/agorise/bitsybitshareswallet/fragments/SettingsFragment.kt @@ -17,8 +17,8 @@ import com.afollestad.materialdialogs.callbacks.onDismiss import com.afollestad.materialdialogs.customview.customView import com.afollestad.materialdialogs.list.customListAdapter import com.afollestad.materialdialogs.list.listItemsSingleChoice -import com.crashlytics.android.Crashlytics import com.google.common.primitives.UnsignedLong +import com.google.firebase.crashlytics.FirebaseCrashlytics import cy.agorise.bitsybitshareswallet.BuildConfig import cy.agorise.bitsybitshareswallet.R import cy.agorise.bitsybitshareswallet.adapters.FullNodesAdapter @@ -98,7 +98,8 @@ class SettingsFragment : ConnectedFragment(), BaseSecurityLockDialog.OnPINPatter override fun onViewCreated(view: View, savedInstanceState: Bundle?) { super.onViewCreated(view, savedInstanceState) - Crashlytics.setString(Constants.CRASHLYTICS_KEY_LAST_SCREEN, TAG) + val crashlytics = FirebaseCrashlytics.getInstance() + crashlytics.setCustomKey(Constants.CRASHLYTICS_KEY_LAST_SCREEN, TAG) val userId = PreferenceManager.getDefaultSharedPreferences(context) .getString(Constants.KEY_CURRENT_ACCOUNT_ID, "") ?: "" @@ -122,7 +123,7 @@ class SettingsFragment : ConnectedFragment(), BaseSecurityLockDialog.OnPINPatter } catch (e: AEADBadTagException) { Log.e(TAG, "AEADBadTagException. Class: " + e.javaClass + ", Msg: " + e.message) } catch (e: IllegalStateException) { - Crashlytics.logException(e) + crashlytics.recordException(e) } } }) diff --git a/app/src/main/java/cy/agorise/bitsybitshareswallet/fragments/TransactionsFragment.kt b/app/src/main/java/cy/agorise/bitsybitshareswallet/fragments/TransactionsFragment.kt index b703113..65782e6 100644 --- a/app/src/main/java/cy/agorise/bitsybitshareswallet/fragments/TransactionsFragment.kt +++ b/app/src/main/java/cy/agorise/bitsybitshareswallet/fragments/TransactionsFragment.kt @@ -16,7 +16,7 @@ import androidx.lifecycle.ViewModelProviders import androidx.recyclerview.widget.LinearLayoutManager import com.afollestad.materialdialogs.MaterialDialog import com.afollestad.materialdialogs.list.listItemsMultiChoice -import com.crashlytics.android.Crashlytics +import com.google.firebase.crashlytics.FirebaseCrashlytics import com.jakewharton.rxbinding3.appcompat.queryTextChangeEvents import cy.agorise.bitsybitshareswallet.R import cy.agorise.bitsybitshareswallet.adapters.TransfersDetailsAdapter @@ -55,7 +55,8 @@ class TransactionsFragment : Fragment(), FilterOptionsDialog.OnFilterOptionsSele override fun onViewCreated(view: View, savedInstanceState: Bundle?) { super.onViewCreated(view, savedInstanceState) - Crashlytics.setString(Constants.CRASHLYTICS_KEY_LAST_SCREEN, TAG) + val crashlytics = FirebaseCrashlytics.getInstance() + crashlytics.setCustomKey(Constants.CRASHLYTICS_KEY_LAST_SCREEN, TAG) val userId = PreferenceManager.getDefaultSharedPreferences(context) .getString(Constants.KEY_CURRENT_ACCOUNT_ID, "") ?: "" diff --git a/app/src/main/java/cy/agorise/bitsybitshareswallet/repositories/NodeRepository.kt b/app/src/main/java/cy/agorise/bitsybitshareswallet/repositories/NodeRepository.kt index 86014be..ef39342 100644 --- a/app/src/main/java/cy/agorise/bitsybitshareswallet/repositories/NodeRepository.kt +++ b/app/src/main/java/cy/agorise/bitsybitshareswallet/repositories/NodeRepository.kt @@ -2,7 +2,7 @@ package cy.agorise.bitsybitshareswallet.repositories import android.os.AsyncTask import android.util.Log -import com.crashlytics.android.Crashlytics +import com.google.firebase.crashlytics.FirebaseCrashlytics import cy.agorise.bitsybitshareswallet.database.daos.NodeDao import cy.agorise.bitsybitshareswallet.database.entities.Node import cy.agorise.bitsybitshareswallet.network.BitsyWebservice @@ -100,7 +100,7 @@ class NodeRepository(private val nodeDao: NodeDao) { } } catch (e: Exception) { // Generic exception handling - Crashlytics.logException(e) + FirebaseCrashlytics.getInstance().recordException(e) } } } diff --git a/app/src/main/java/cy/agorise/bitsybitshareswallet/utils/BitsyApplication.kt b/app/src/main/java/cy/agorise/bitsybitshareswallet/utils/BitsyApplication.kt index 92fbb80..ba28b9b 100644 --- a/app/src/main/java/cy/agorise/bitsybitshareswallet/utils/BitsyApplication.kt +++ b/app/src/main/java/cy/agorise/bitsybitshareswallet/utils/BitsyApplication.kt @@ -2,7 +2,7 @@ package cy.agorise.bitsybitshareswallet.utils import android.app.Application import android.util.Log -import com.crashlytics.android.Crashlytics +import com.google.firebase.crashlytics.FirebaseCrashlytics import cy.agorise.bitsybitshareswallet.database.BitsyDatabase import cy.agorise.bitsybitshareswallet.network.NetworkServiceManager import cy.agorise.bitsybitshareswallet.repositories.NodeRepository @@ -34,7 +34,7 @@ class BitsyApplication : Application() { // exception to Crashlytics so that we can fix the issues RxJavaPlugins.setErrorHandler { throwable -> Log.e("RxJava Error", throwable.message) - Crashlytics.logException(throwable) + FirebaseCrashlytics.getInstance().recordException(throwable) } appScope = CoroutineScope(Dispatchers.Main + applicationJob) diff --git a/app/src/main/java/cy/agorise/bitsybitshareswallet/utils/Constants.kt b/app/src/main/java/cy/agorise/bitsybitshareswallet/utils/Constants.kt index 872f57c..0ad9922 100644 --- a/app/src/main/java/cy/agorise/bitsybitshareswallet/utils/Constants.kt +++ b/app/src/main/java/cy/agorise/bitsybitshareswallet/utils/Constants.kt @@ -158,6 +158,9 @@ object Constants { /** Key used to add the account ID to the Crashlytics report*/ const val CRASHLYTICS_KEY_ACCOUNT_ID = "crashlytics_key_account_id" + /** Key used to add the current node the app is connected to to the Crashlytics report*/ + const val CRASHLYTICS_KEY_CURRENT_NODE = "crashlytics_key_current_node" + /** Definition of the system core (BTS) asset id */ const val CORE_ASSET = "1.3.0" } diff --git a/build.gradle b/build.gradle index 167b07e..8a5c631 100644 --- a/build.gradle +++ b/build.gradle @@ -11,17 +11,13 @@ buildscript { repositories { google() jcenter() - maven { - url 'https://maven.fabric.io/public' - } - } dependencies { classpath 'com.android.tools.build:gradle:3.5.3' classpath "org.jetbrains.kotlin:kotlin-gradle-plugin:$kotlin_version" classpath "androidx.navigation:navigation-safe-args-gradle-plugin:$nav_version" - classpath 'com.google.gms:google-services:4.3.3' - classpath 'io.fabric.tools:gradle:1.29.0' + classpath 'com.google.gms:google-services:4.3.4' + classpath 'com.google.firebase:firebase-crashlytics-gradle:2.4.1' // NOTE: Do not place your application dependencies here; they belong // in the individual module build.gradle files