From f6844a7c07fa755fcad37af63f47e0cd57e33ed0 Mon Sep 17 00:00:00 2001 From: Alex Baker Date: Tue, 18 Aug 2020 13:19:51 -0500 Subject: [PATCH] Update analytics, crashlytics, and remote config --- app/build.gradle.kts | 13 ++-- .../org/tasks/preferences/fragments/Debug.kt | 4 ++ app/src/debug/res/values/keys.xml | 1 + app/src/debug/res/xml/preferences_debug.xml | 4 ++ .../java/org/tasks/analytics/Firebase.kt | 70 +++++++++---------- buildSrc/src/main/kotlin/Versions.kt | 6 +- 6 files changed, 55 insertions(+), 43 deletions(-) diff --git a/app/build.gradle.kts b/app/build.gradle.kts index 9a441a443..197a71887 100644 --- a/app/build.gradle.kts +++ b/app/build.gradle.kts @@ -85,11 +85,12 @@ android { @Suppress("LocalVariableName") buildTypes { getByName("debug") { + applicationIdSuffix = ".debug" + firebaseCrashlytics { + mappingFileUploadEnabled = false + } val tasks_mapbox_key_debug: String? by project val tasks_google_key_debug: String? by project - ext["enableCrashlytics"] = false - ext["alwaysUpdateBuildId"] = false - applicationIdSuffix = ".debug" resValue("string", "mapbox_key", tasks_mapbox_key_debug ?: "") resValue("string", "google_key", tasks_google_key_debug ?: "") isTestCoverageEnabled = project.hasProperty("coverage") @@ -207,12 +208,16 @@ dependencies { // https://github.com/mapbox/mapbox-gl-native-android/issues/316 genericImplementation("com.mapbox.mapboxsdk:mapbox-android-sdk:7.4.1") - googleplayImplementation("com.crashlytics.sdk.android:crashlytics:${Versions.crashlytics}") + googleplayImplementation("com.google.firebase:firebase-crashlytics:${Versions.crashlytics}") googleplayImplementation("com.google.firebase:firebase-analytics:${Versions.analytics}") googleplayImplementation("com.google.firebase:firebase-config-ktx:${Versions.remote_config}") googleplayImplementation("com.google.android.gms:play-services-location:17.0.0") googleplayImplementation("com.google.android.gms:play-services-maps:17.0.0") + // Remove transport-runtime and transport-backend-cct after places update googleplayImplementation("com.google.android.libraries.places:places:2.3.0") + // https://issuetracker.google.com/issues/161157921#comment6 + googleplayImplementation("com.google.android.datatransport:transport-runtime:2.2.3") + googleplayImplementation("com.google.android.datatransport:transport-backend-cct:2.3.0") googleplayImplementation("com.android.billingclient:billing:1.2.2") androidTestImplementation("com.google.dagger:hilt-android-testing:${Versions.hilt}") diff --git a/app/src/debug/java/org/tasks/preferences/fragments/Debug.kt b/app/src/debug/java/org/tasks/preferences/fragments/Debug.kt index 34622ec91..00c28ead7 100644 --- a/app/src/debug/java/org/tasks/preferences/fragments/Debug.kt +++ b/app/src/debug/java/org/tasks/preferences/fragments/Debug.kt @@ -44,6 +44,10 @@ class Debug : InjectingPreferenceFragment() { setupIap(R.string.debug_themes, Inventory.SKU_THEMES) setupIap(R.string.debug_tasker, Inventory.SKU_TASKER) + + findPreference(R.string.debug_crash_app).setOnPreferenceClickListener { + throw RuntimeException("Crashed app from debug preferences") + } } private fun setupIap(@StringRes prefId: Int, sku: String) { diff --git a/app/src/debug/res/values/keys.xml b/app/src/debug/res/values/keys.xml index a455a5e0c..15ac6b15d 100644 --- a/app/src/debug/res/values/keys.xml +++ b/app/src/debug/res/values/keys.xml @@ -14,5 +14,6 @@ debug_themes debug_tasker Reset SSL certificates + Crash app now Crash on violation \ No newline at end of file diff --git a/app/src/debug/res/xml/preferences_debug.xml b/app/src/debug/res/xml/preferences_debug.xml index b5a2c663e..4543d6082 100644 --- a/app/src/debug/res/xml/preferences_debug.xml +++ b/app/src/debug/res/xml/preferences_debug.xml @@ -30,6 +30,10 @@ android:key="@string/debug_reset_ssl" android:title="@string/debug_reset_ssl" /> + + diff --git a/app/src/googleplay/java/org/tasks/analytics/Firebase.kt b/app/src/googleplay/java/org/tasks/analytics/Firebase.kt index 79385cefc..c766e9339 100644 --- a/app/src/googleplay/java/org/tasks/analytics/Firebase.kt +++ b/app/src/googleplay/java/org/tasks/analytics/Firebase.kt @@ -4,12 +4,11 @@ import android.content.Context import android.os.Bundle import androidx.annotation.StringRes import com.android.billingclient.api.BillingClient.BillingResponse -import com.crashlytics.android.Crashlytics import com.google.firebase.analytics.FirebaseAnalytics +import com.google.firebase.crashlytics.FirebaseCrashlytics import com.google.firebase.remoteconfig.FirebaseRemoteConfig import com.google.firebase.remoteconfig.ktx.remoteConfigSettings import dagger.hilt.android.qualifiers.ApplicationContext -import io.fabric.sdk.android.Fabric import org.tasks.R import org.tasks.billing.BillingClientImpl import org.tasks.jobs.WorkManager @@ -20,64 +19,63 @@ import javax.inject.Inject import javax.inject.Singleton @Singleton -class Firebase @Inject constructor(@param:ApplicationContext val context: Context, preferences: Preferences) { +class Firebase @Inject constructor( + @param:ApplicationContext val context: Context, + preferences: Preferences +) { - private var enabled: Boolean = preferences.isTrackingEnabled + private var crashlytics: FirebaseCrashlytics? = null private var analytics: FirebaseAnalytics? = null private var remoteConfig: FirebaseRemoteConfig? = null fun reportException(t: Throwable) { Timber.e(t) - if (enabled) { - Crashlytics.logException(t) - } + crashlytics?.recordException(t) } fun reportIabResult(@BillingResponse response: Int, sku: String?) { - if (!enabled) { - return - } - val bundle = Bundle() - bundle.putString(FirebaseAnalytics.Param.ITEM_ID, sku) - bundle.putString(FirebaseAnalytics.Param.SUCCESS, BillingClientImpl.BillingResponseToString(response)) - analytics?.logEvent(FirebaseAnalytics.Event.ECOMMERCE_PURCHASE, bundle) + analytics?.logEvent(FirebaseAnalytics.Event.ECOMMERCE_PURCHASE, Bundle().apply { + putString(FirebaseAnalytics.Param.ITEM_ID, sku) + putString(FirebaseAnalytics.Param.SUCCESS, BillingClientImpl.BillingResponseToString(response)) + }) } fun updateRemoteConfig() { - if (!enabled) { - return - } remoteConfig?.fetchAndActivate()?.addOnSuccessListener { Timber.d(it.toString()) } } fun logEvent(@StringRes event: Int, vararg p: Pair) { - val bundle = Bundle() - p.forEach { - val key = context.getString(it.first) - when (it.second::class) { - String::class -> bundle.putString(key, it.second as String) - Boolean::class -> bundle.putBoolean(key, it.second as Boolean) - else -> Timber.e("Unhandled param: $it") + analytics?.logEvent(context.getString(event), Bundle().apply { + p.forEach { + val key = context.getString(it.first) + when (it.second::class) { + String::class -> putString(key, it.second as String) + Boolean::class -> putBoolean(key, it.second as Boolean) + else -> Timber.e("Unhandled param: $it") + } } - } - analytics?.logEvent(context.getString(event), bundle) + }) } fun noChurn(): Boolean = remoteConfig?.getBoolean("no_churn") ?: false init { - if (enabled) { - analytics = FirebaseAnalytics.getInstance(context) - analytics?.setAnalyticsCollectionEnabled(true) - Fabric.with(context, Crashlytics()) - remoteConfig = FirebaseRemoteConfig.getInstance() - remoteConfig?.setConfigSettingsAsync(remoteConfigSettings { - minimumFetchIntervalInSeconds = - TimeUnit.HOURS.toSeconds(WorkManager.REMOTE_CONFIG_INTERVAL_HOURS) - }) - remoteConfig?.setDefaultsAsync(R.xml.remote_config_defaults) + if (preferences.isTrackingEnabled) { + analytics = FirebaseAnalytics.getInstance(context).apply { + setAnalyticsCollectionEnabled(true) + } + crashlytics = FirebaseCrashlytics.getInstance().apply { + setCrashlyticsCollectionEnabled(true) + } + remoteConfig = FirebaseRemoteConfig.getInstance().apply { + setConfigSettingsAsync(remoteConfigSettings { + minimumFetchIntervalInSeconds = + TimeUnit.HOURS.toSeconds(WorkManager.REMOTE_CONFIG_INTERVAL_HOURS) + }) + setDefaultsAsync(R.xml.remote_config_defaults) + } } } } \ No newline at end of file diff --git a/buildSrc/src/main/kotlin/Versions.kt b/buildSrc/src/main/kotlin/Versions.kt index 71da5ba59..8ac4c7245 100644 --- a/buildSrc/src/main/kotlin/Versions.kt +++ b/buildSrc/src/main/kotlin/Versions.kt @@ -6,9 +6,9 @@ object Versions { const val work = "2.3.4" const val leakcanary = "2.4" const val room = "2.2.5" - const val crashlytics = "2.10.1" - const val analytics = "17.4.4" - const val remote_config = "19.1.4" + const val crashlytics = "17.2.1" + const val analytics = "17.5.0" + const val remote_config = "19.2.0" const val okhttp = "4.7.2" const val flipper = "0.51.0" const val mockito = "3.3.3"