diff --git a/app/build.gradle b/app/build.gradle index 4180e5c9..79e26141 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: 'realm-android' -apply plugin: 'io.fabric' apply plugin: 'com.google.gms.google-services' // Crashlytics +apply plugin: 'com.google.firebase.crashlytics' repositories { maven { url 'https://maven.fabric.io/public' } @@ -122,8 +122,8 @@ dependencies { // Firebase implementation 'com.google.firebase:firebase-core:17.5.0' - // Crashlytics - implementation 'com.crashlytics.sdk.android:crashlytics:2.10.1' + // Add the Firebase Crashlytics SDK. + implementation 'com.google.firebase:firebase-crashlytics:17.2.2' // Logs implementation 'com.jakewharton.timber:timber:4.7.1' diff --git a/app/google-services.json b/app/google-services.json index f242d7b2..593ef318 100644 --- a/app/google-services.json +++ b/app/google-services.json @@ -14,6 +14,14 @@ } }, "oauth_client": [ + { + "client_id": "245968016816-hhn8q9hij1njadqg7ut7p1e6pmu0vi5k.apps.googleusercontent.com", + "client_type": 1, + "android_info": { + "package_name": "net.pokeranalytics.android", + "certificate_hash": "25d12647d4391ed03572882b546482746d2b302e" + } + }, { "client_id": "245968016816-tr2mo4kbe1acn8u3ebbd9nk29iuk8fqr.apps.googleusercontent.com", "client_type": 1, @@ -29,24 +37,24 @@ ], "api_key": [ { - "current_key": "AIzaSyDERILd3hSujwzqHcS4CyQjiDI7J6WvNZ4" + "current_key": "AIzaSyCXQK-w_eeUMI9hYRXKmTr6SH7QNq0xnh8" } ], "services": { - "analytics_service": { - "status": 1 - }, "appinvite_service": { - "status": 2, "other_platform_oauth_client": [ { "client_id": "245968016816-756j040n0luup2nlfu9e49qm9jv0oih2.apps.googleusercontent.com", "client_type": 3 + }, + { + "client_id": "245968016816-8sklai9sq70m46anv550uttdic6cukn6.apps.googleusercontent.com", + "client_type": 2, + "ios_info": { + "bundle_id": "stax.SlashPoker.nosebleed" + } } ] - }, - "ads_service": { - "status": 2 } } } diff --git a/app/src/main/java/net/pokeranalytics/android/PokerAnalyticsApplication.kt b/app/src/main/java/net/pokeranalytics/android/PokerAnalyticsApplication.kt index fa64d55f..25be16f5 100644 --- a/app/src/main/java/net/pokeranalytics/android/PokerAnalyticsApplication.kt +++ b/app/src/main/java/net/pokeranalytics/android/PokerAnalyticsApplication.kt @@ -3,9 +3,7 @@ package net.pokeranalytics.android import android.app.Application import android.content.Context import android.os.Build -import com.crashlytics.android.Crashlytics -import com.crashlytics.android.core.CrashlyticsCore -import io.fabric.sdk.android.Fabric +import com.google.firebase.crashlytics.FirebaseCrashlytics import io.realm.Realm import io.realm.RealmConfiguration import io.realm.kotlin.where @@ -51,23 +49,9 @@ class PokerAnalyticsApplication : Application() { .build() Realm.setDefaultConfiguration(realmConfiguration) - -// val realm = Realm.getDefaultInstance() -// realm.executeTransaction { -// realm.where(Session::class.java).findAll().deleteAllFromRealm() -// } -// realm.close() - - // Set up Crashlytics, disabled for debug builds - val crashlyticsKit = Crashlytics.Builder() - .core(CrashlyticsCore.Builder().disabled(BuildConfig.DEBUG).build()) - .build() - - // Initialize Fabric with the debug-disabled crashlytics. - Fabric.with(this, crashlyticsKit) if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.N) { val locales = resources.configuration.locales - Crashlytics.log("App onCreate. Locales = $locales") + FirebaseCrashlytics.getInstance().log("App onCreate. Locales = $locales") } if (BuildConfig.DEBUG) { @@ -85,7 +69,7 @@ class PokerAnalyticsApplication : Application() { Patcher.patchAll(this.applicationContext) val locale = Locale.getDefault() - Crashlytics.log("Country: ${locale.country}, language: ${locale.language}") + FirebaseCrashlytics.getInstance().log("Country: ${locale.country}, language: ${locale.language}") } diff --git a/app/src/main/java/net/pokeranalytics/android/model/filter/Filterable.kt b/app/src/main/java/net/pokeranalytics/android/model/filter/Filterable.kt index 213b6398..c6bcff9f 100644 --- a/app/src/main/java/net/pokeranalytics/android/model/filter/Filterable.kt +++ b/app/src/main/java/net/pokeranalytics/android/model/filter/Filterable.kt @@ -1,10 +1,10 @@ package net.pokeranalytics.android.model.filter -import com.crashlytics.android.Crashlytics import io.realm.RealmModel import io.realm.RealmResults import net.pokeranalytics.android.exceptions.PAIllegalStateException import net.pokeranalytics.android.model.realm.* +import net.pokeranalytics.android.model.utils.CrashLogging /** * We want to be able to store filters in the database: @@ -65,7 +65,7 @@ class FilterHelper { Transaction::class.java -> Transaction.fieldNameForQueryType(queryCondition) Result::class.java -> Result.fieldNameForQueryType(queryCondition) else -> { - Crashlytics.logException(PAIllegalStateException("Filterable type fields are not defined for condition ${queryCondition::class}, class ${T::class}")) + CrashLogging.logException(PAIllegalStateException("Filterable type fields are not defined for condition ${queryCondition::class}, class ${T::class}")) null // throw UnmanagedFilterField("Filterable type fields are not defined for class ${T::class}") } diff --git a/app/src/main/java/net/pokeranalytics/android/model/realm/Session.kt b/app/src/main/java/net/pokeranalytics/android/model/realm/Session.kt index a6b0d5b0..92adfc16 100644 --- a/app/src/main/java/net/pokeranalytics/android/model/realm/Session.kt +++ b/app/src/main/java/net/pokeranalytics/android/model/realm/Session.kt @@ -1,7 +1,6 @@ package net.pokeranalytics.android.model.realm import android.content.Context -import com.crashlytics.android.Crashlytics import com.github.mikephil.charting.data.Entry import io.realm.Realm import io.realm.RealmList @@ -28,6 +27,7 @@ import net.pokeranalytics.android.model.filter.QueryCondition import net.pokeranalytics.android.model.filter.QueryCondition.* import net.pokeranalytics.android.model.interfaces.* import net.pokeranalytics.android.model.realm.handhistory.HandHistory +import net.pokeranalytics.android.model.utils.CrashLogging import net.pokeranalytics.android.model.utils.SessionSetManager import net.pokeranalytics.android.ui.adapter.UnmanagedRowRepresentableException import net.pokeranalytics.android.ui.fragment.GraphFragment @@ -654,14 +654,14 @@ open class Session : RealmObject(), Savable, Editable, RowRepresentable, Timed, */ fun delete() { - Crashlytics.log("Deletes session. Id = ${this.id}") + CrashLogging.log("Deletes session. Id = ${this.id}") if (isValid) { realm.executeTransaction { cleanup() deleteFromRealm() } } else { - Crashlytics.log("Attempt to delete an invalid session") + CrashLogging.log("Attempt to delete an invalid session") } } diff --git a/app/src/main/java/net/pokeranalytics/android/model/utils/CrashLogging.kt b/app/src/main/java/net/pokeranalytics/android/model/utils/CrashLogging.kt new file mode 100644 index 00000000..7714894b --- /dev/null +++ b/app/src/main/java/net/pokeranalytics/android/model/utils/CrashLogging.kt @@ -0,0 +1,20 @@ +package net.pokeranalytics.android.model.utils + +import com.google.firebase.crashlytics.FirebaseCrashlytics + +class CrashLogging { + + companion object { + + fun logException(e: Exception) { + FirebaseCrashlytics.getInstance().recordException(e) + } + + fun log(message: String) { + FirebaseCrashlytics.getInstance().log(message) + } + + } + + +} \ No newline at end of file diff --git a/app/src/main/java/net/pokeranalytics/android/ui/activity/components/BaseActivity.kt b/app/src/main/java/net/pokeranalytics/android/ui/activity/components/BaseActivity.kt index a15ebe9d..348c26ba 100644 --- a/app/src/main/java/net/pokeranalytics/android/ui/activity/components/BaseActivity.kt +++ b/app/src/main/java/net/pokeranalytics/android/ui/activity/components/BaseActivity.kt @@ -12,9 +12,9 @@ import androidx.core.content.ContextCompat import androidx.fragment.app.Fragment import androidx.lifecycle.ViewModel import androidx.lifecycle.ViewModelProvider -import com.crashlytics.android.Crashlytics import io.realm.Realm import net.pokeranalytics.android.model.realm.Location +import net.pokeranalytics.android.model.utils.CrashLogging import net.pokeranalytics.android.ui.adapter.RowRepresentableDelegate import net.pokeranalytics.android.ui.view.RowRepresentable import net.pokeranalytics.android.util.LocationManager @@ -53,33 +53,33 @@ abstract class BaseActivity : AppCompatActivity() { override fun onCreate(savedInstanceState: Bundle?) { super.onCreate(savedInstanceState) - Crashlytics.log("$this.localClassName onCreate, savedInstanceState=$savedInstanceState") + CrashLogging.log("$this.localClassName onCreate, savedInstanceState=$savedInstanceState") } override fun onCreate(savedInstanceState: Bundle?, persistentState: PersistableBundle?) { super.onCreate(savedInstanceState, persistentState) - Crashlytics.log("$this.localClassName onCreate: bundle=$savedInstanceState, persistentState=$persistentState") + CrashLogging.log("$this.localClassName onCreate: bundle=$savedInstanceState, persistentState=$persistentState") requestedOrientation = ActivityInfo.SCREEN_ORIENTATION_PORTRAIT // fixes crash } override fun onResume() { super.onResume() - Crashlytics.log("$this.localClassName onResume") + CrashLogging.log("$this.localClassName onResume") } override fun onPause() { super.onPause() - Crashlytics.log("$this.localClassName onPause") + CrashLogging.log("$this.localClassName onPause") } override fun onStop() { super.onStop() - Crashlytics.log("$this.localClassName onStop") + CrashLogging.log("$this.localClassName onStop") } override fun onDestroy() { super.onDestroy() - Crashlytics.log("$this.localClassName onDestroy") + CrashLogging.log("$this.localClassName onDestroy") this.realm?.close() } diff --git a/app/src/main/java/net/pokeranalytics/android/ui/fragment/SubscriptionFragment.kt b/app/src/main/java/net/pokeranalytics/android/ui/fragment/SubscriptionFragment.kt index 88fcd6ec..aa5b22b5 100644 --- a/app/src/main/java/net/pokeranalytics/android/ui/fragment/SubscriptionFragment.kt +++ b/app/src/main/java/net/pokeranalytics/android/ui/fragment/SubscriptionFragment.kt @@ -22,10 +22,10 @@ import androidx.fragment.app.FragmentManager import androidx.fragment.app.FragmentStatePagerAdapter import androidx.viewpager.widget.ViewPager import com.android.billingclient.api.* -import com.crashlytics.android.Crashlytics import kotlinx.android.synthetic.main.fragment_subscription.* import net.pokeranalytics.android.R import net.pokeranalytics.android.exceptions.PAIllegalStateException +import net.pokeranalytics.android.model.utils.CrashLogging import net.pokeranalytics.android.ui.extensions.px import net.pokeranalytics.android.ui.fragment.components.BaseFragment import net.pokeranalytics.android.ui.fragment.components.ScreenSlidePageFragment @@ -221,7 +221,7 @@ class SubscriptionFragment : BaseFragment(), SkuDetailsResponseListener, Purchas val p = Period.parse(it.freeTrialPeriod) freeTrialDays = p.days } catch (e: DateTimeParseException) { - Crashlytics.log("Error parsing period with value: ${it.freeTrialPeriod}") + CrashLogging.log("Error parsing period with value: ${it.freeTrialPeriod}") } } val formattedFreeTrial = diff --git a/app/src/main/java/net/pokeranalytics/android/ui/fragment/components/BaseFragment.kt b/app/src/main/java/net/pokeranalytics/android/ui/fragment/components/BaseFragment.kt index a40e1aff..3beff495 100644 --- a/app/src/main/java/net/pokeranalytics/android/ui/fragment/components/BaseFragment.kt +++ b/app/src/main/java/net/pokeranalytics/android/ui/fragment/components/BaseFragment.kt @@ -4,8 +4,8 @@ import android.os.Bundle import android.view.View import androidx.appcompat.widget.Toolbar import androidx.fragment.app.Fragment -import com.crashlytics.android.Crashlytics import net.pokeranalytics.android.R +import net.pokeranalytics.android.model.utils.CrashLogging import net.pokeranalytics.android.ui.activity.components.BaseActivity import net.pokeranalytics.android.ui.adapter.RowRepresentableDelegate import net.pokeranalytics.android.ui.fragment.components.bottomsheet.BottomSheetFragment @@ -31,7 +31,7 @@ abstract class BaseFragment : Fragment() { override fun onCreate(savedInstanceState: Bundle?) { super.onCreate(savedInstanceState) - Crashlytics.log("$this.localClassName onCreate") + CrashLogging.log("$this.localClassName onCreate") } override fun onViewCreated(view: View, savedInstanceState: Bundle?) { @@ -41,22 +41,22 @@ abstract class BaseFragment : Fragment() { override fun onResume() { super.onResume() - Crashlytics.log("$this.localClassName onResume") + CrashLogging.log("$this.localClassName onResume") } override fun onPause() { super.onPause() - Crashlytics.log("$this.localClassName onPause") + CrashLogging.log("$this.localClassName onPause") } override fun onDestroy() { super.onDestroy() - Crashlytics.log("$this.localClassName onDestroy") + CrashLogging.log("$this.localClassName onDestroy") } override fun onActivityCreated(savedInstanceState: Bundle?) { super.onActivityCreated(savedInstanceState) - Crashlytics.log("$this.localClassName onActivityCreated") + CrashLogging.log("$this.localClassName onActivityCreated") } /** diff --git a/app/src/main/java/net/pokeranalytics/android/ui/graph/GraphExtensions.kt b/app/src/main/java/net/pokeranalytics/android/ui/graph/GraphExtensions.kt index 63193351..dd2f28da 100644 --- a/app/src/main/java/net/pokeranalytics/android/ui/graph/GraphExtensions.kt +++ b/app/src/main/java/net/pokeranalytics/android/ui/graph/GraphExtensions.kt @@ -4,11 +4,11 @@ import android.content.Context import android.content.res.Resources import androidx.core.content.ContextCompat import androidx.core.content.res.ResourcesCompat -import com.crashlytics.android.Crashlytics import com.github.mikephil.charting.charts.BarChart import com.github.mikephil.charting.charts.BarLineChartBase import com.github.mikephil.charting.components.XAxis import net.pokeranalytics.android.R +import net.pokeranalytics.android.model.utils.CrashLogging import net.pokeranalytics.android.ui.extensions.px enum class AxisFormatting { @@ -39,7 +39,7 @@ fun BarLineChartBase<*>.setStyle( val font = ResourcesCompat.getFont(context, R.font.roboto_medium) this.xAxis.typeface = font } catch (e: Resources.NotFoundException) { - Crashlytics.log(e.message) + CrashLogging.log(e.message ?: "BarLineChartBase<*>.setStyle: Resources.NotFoundException") } this.xAxis.labelCount = 4 @@ -68,7 +68,7 @@ fun BarLineChartBase<*>.setStyle( val font = ResourcesCompat.getFont(context, R.font.roboto_medium) this.axisLeft.typeface = font } catch (e: Resources.NotFoundException) { - Crashlytics.log(e.message) + CrashLogging.log(e.message ?: "BarLineChartBase<*>.setStyle: Resources.NotFoundException") } this.axisLeft.labelCount = diff --git a/app/src/main/java/net/pokeranalytics/android/ui/modules/data/EditableDataFragment.kt b/app/src/main/java/net/pokeranalytics/android/ui/modules/data/EditableDataFragment.kt index 4afb19aa..acf1db8b 100644 --- a/app/src/main/java/net/pokeranalytics/android/ui/modules/data/EditableDataFragment.kt +++ b/app/src/main/java/net/pokeranalytics/android/ui/modules/data/EditableDataFragment.kt @@ -5,13 +5,13 @@ import android.view.LayoutInflater import android.view.View import android.view.ViewGroup import androidx.recyclerview.widget.LinearLayoutManager -import com.crashlytics.android.Crashlytics import io.realm.RealmModel import kotlinx.android.synthetic.main.fragment_editable_data.* import kotlinx.android.synthetic.main.fragment_editable_data.view.* import net.pokeranalytics.android.R import net.pokeranalytics.android.model.interfaces.Editable import net.pokeranalytics.android.model.interfaces.NameManageable +import net.pokeranalytics.android.model.utils.CrashLogging import net.pokeranalytics.android.ui.adapter.RowRepresentableAdapter import net.pokeranalytics.android.ui.adapter.RowRepresentableDataSource import net.pokeranalytics.android.ui.adapter.RowRepresentableDelegate @@ -70,7 +70,7 @@ open class EditableDataFragment : DataManagerFragment(), RowRepresentableDelegat try { (this.model.item as Editable).updateValue(value, row) } catch (e: Exception) { - Crashlytics.log("Exception caught: row = $row, value=$value, class=${this.javaClass}") + CrashLogging.log("Exception caught: row = $row, value=$value, class=${this.javaClass}") throw e } diff --git a/app/src/main/java/net/pokeranalytics/android/ui/modules/session/SessionFragment.kt b/app/src/main/java/net/pokeranalytics/android/ui/modules/session/SessionFragment.kt index 569f2872..a4b6f00b 100644 --- a/app/src/main/java/net/pokeranalytics/android/ui/modules/session/SessionFragment.kt +++ b/app/src/main/java/net/pokeranalytics/android/ui/modules/session/SessionFragment.kt @@ -11,7 +11,6 @@ import androidx.appcompat.content.res.AppCompatResources import androidx.interpolator.view.animation.FastOutSlowInInterpolator import androidx.lifecycle.ViewModelProvider import androidx.recyclerview.widget.DiffUtil -import com.crashlytics.android.Crashlytics import kotlinx.android.synthetic.main.fragment_session.* import kotlinx.coroutines.GlobalScope import kotlinx.coroutines.async @@ -27,6 +26,7 @@ import net.pokeranalytics.android.model.extensions.getState import net.pokeranalytics.android.model.extensions.scheduleStopNotification import net.pokeranalytics.android.model.interfaces.SaveValidityStatus import net.pokeranalytics.android.model.realm.* +import net.pokeranalytics.android.model.utils.CrashLogging import net.pokeranalytics.android.model.utils.FavoriteSessionFinder import net.pokeranalytics.android.ui.adapter.RowRepresentableAdapter import net.pokeranalytics.android.ui.adapter.RowRepresentableDelegate @@ -75,7 +75,7 @@ class SessionFragment : RealmFragment(), RowRepresentableDelegate, StaticRowRepr override fun onResume() { super.onResume() - Crashlytics.log("session (id=${this.currentSession.id}): valid=${currentSession.isValid}, managed=${currentSession.isManaged}, loaded=${currentSession.isLoaded} ") + CrashLogging.log("session (id=${this.currentSession.id}): valid=${currentSession.isValid}, managed=${currentSession.isManaged}, loaded=${currentSession.isLoaded} ") this.refreshTimer() } diff --git a/build.gradle b/build.gradle index 392e61d6..8d41c016 100644 --- a/build.gradle +++ b/build.gradle @@ -1,20 +1,18 @@ // Top-level build file where you can add configuration options common to all sub-projects/modules. buildscript { - ext.kotlin_version = '1.3.72' + ext.kotlin_version = '1.4.10' repositories { google() jcenter() - maven { - url 'https://maven.fabric.io/public' - } } dependencies { classpath 'com.android.tools.build:gradle:3.6.4' classpath "org.jetbrains.kotlin:kotlin-gradle-plugin:$kotlin_version" classpath 'io.realm:realm-gradle-plugin:5.15.2' - classpath 'com.google.gms:google-services:4.3.3' - classpath 'io.fabric.tools:gradle:1.31.2' + classpath 'com.google.gms:google-services:4.3.4' + classpath 'com.google.firebase:firebase-crashlytics-gradle:2.3.0' + } }