Update analytics, crashlytics, and remote config

pull/1086/head
Alex Baker 4 years ago
parent bd282e4c8c
commit f6844a7c07

@ -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}")

@ -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) {

@ -14,5 +14,6 @@
<string name="debug_themes">debug_themes</string>
<string name="debug_tasker">debug_tasker</string>
<string name="debug_reset_ssl">Reset SSL certificates</string>
<string name="debug_crash_app">Crash app now</string>
<string name="debug_main_queries">Crash on violation</string>
</resources>

@ -30,6 +30,10 @@
android:key="@string/debug_reset_ssl"
android:title="@string/debug_reset_ssl" />
<Preference
android:key="@string/debug_crash_app"
android:title="@string/debug_crash_app" />
<Preference
android:key="@string/debug_themes"/>

@ -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<Int, Any>) {
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)
}
}
}
}

@ -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"

Loading…
Cancel
Save