Update analytics, crashlytics, and remote config

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

@ -85,11 +85,12 @@ android {
@Suppress("LocalVariableName") @Suppress("LocalVariableName")
buildTypes { buildTypes {
getByName("debug") { getByName("debug") {
applicationIdSuffix = ".debug"
firebaseCrashlytics {
mappingFileUploadEnabled = false
}
val tasks_mapbox_key_debug: String? by project val tasks_mapbox_key_debug: String? by project
val tasks_google_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", "mapbox_key", tasks_mapbox_key_debug ?: "")
resValue("string", "google_key", tasks_google_key_debug ?: "") resValue("string", "google_key", tasks_google_key_debug ?: "")
isTestCoverageEnabled = project.hasProperty("coverage") isTestCoverageEnabled = project.hasProperty("coverage")
@ -207,12 +208,16 @@ dependencies {
// https://github.com/mapbox/mapbox-gl-native-android/issues/316 // https://github.com/mapbox/mapbox-gl-native-android/issues/316
genericImplementation("com.mapbox.mapboxsdk:mapbox-android-sdk:7.4.1") 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-analytics:${Versions.analytics}")
googleplayImplementation("com.google.firebase:firebase-config-ktx:${Versions.remote_config}") 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-location:17.0.0")
googleplayImplementation("com.google.android.gms:play-services-maps: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") 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") googleplayImplementation("com.android.billingclient:billing:1.2.2")
androidTestImplementation("com.google.dagger:hilt-android-testing:${Versions.hilt}") 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_themes, Inventory.SKU_THEMES)
setupIap(R.string.debug_tasker, Inventory.SKU_TASKER) 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) { private fun setupIap(@StringRes prefId: Int, sku: String) {

@ -14,5 +14,6 @@
<string name="debug_themes">debug_themes</string> <string name="debug_themes">debug_themes</string>
<string name="debug_tasker">debug_tasker</string> <string name="debug_tasker">debug_tasker</string>
<string name="debug_reset_ssl">Reset SSL certificates</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> <string name="debug_main_queries">Crash on violation</string>
</resources> </resources>

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

@ -4,12 +4,11 @@ import android.content.Context
import android.os.Bundle import android.os.Bundle
import androidx.annotation.StringRes import androidx.annotation.StringRes
import com.android.billingclient.api.BillingClient.BillingResponse import com.android.billingclient.api.BillingClient.BillingResponse
import com.crashlytics.android.Crashlytics
import com.google.firebase.analytics.FirebaseAnalytics import com.google.firebase.analytics.FirebaseAnalytics
import com.google.firebase.crashlytics.FirebaseCrashlytics
import com.google.firebase.remoteconfig.FirebaseRemoteConfig import com.google.firebase.remoteconfig.FirebaseRemoteConfig
import com.google.firebase.remoteconfig.ktx.remoteConfigSettings import com.google.firebase.remoteconfig.ktx.remoteConfigSettings
import dagger.hilt.android.qualifiers.ApplicationContext import dagger.hilt.android.qualifiers.ApplicationContext
import io.fabric.sdk.android.Fabric
import org.tasks.R import org.tasks.R
import org.tasks.billing.BillingClientImpl import org.tasks.billing.BillingClientImpl
import org.tasks.jobs.WorkManager import org.tasks.jobs.WorkManager
@ -20,64 +19,63 @@ import javax.inject.Inject
import javax.inject.Singleton import javax.inject.Singleton
@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 analytics: FirebaseAnalytics? = null
private var remoteConfig: FirebaseRemoteConfig? = null private var remoteConfig: FirebaseRemoteConfig? = null
fun reportException(t: Throwable) { fun reportException(t: Throwable) {
Timber.e(t) Timber.e(t)
if (enabled) { crashlytics?.recordException(t)
Crashlytics.logException(t)
}
} }
fun reportIabResult(@BillingResponse response: Int, sku: String?) { fun reportIabResult(@BillingResponse response: Int, sku: String?) {
if (!enabled) { analytics?.logEvent(FirebaseAnalytics.Event.ECOMMERCE_PURCHASE, Bundle().apply {
return putString(FirebaseAnalytics.Param.ITEM_ID, sku)
} putString(FirebaseAnalytics.Param.SUCCESS, BillingClientImpl.BillingResponseToString(response))
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)
} }
fun updateRemoteConfig() { fun updateRemoteConfig() {
if (!enabled) {
return
}
remoteConfig?.fetchAndActivate()?.addOnSuccessListener { remoteConfig?.fetchAndActivate()?.addOnSuccessListener {
Timber.d(it.toString()) Timber.d(it.toString())
} }
} }
fun logEvent(@StringRes event: Int, vararg p: Pair<Int, Any>) { fun logEvent(@StringRes event: Int, vararg p: Pair<Int, Any>) {
val bundle = Bundle() analytics?.logEvent(context.getString(event), Bundle().apply {
p.forEach { p.forEach {
val key = context.getString(it.first) val key = context.getString(it.first)
when (it.second::class) { when (it.second::class) {
String::class -> bundle.putString(key, it.second as String) String::class -> putString(key, it.second as String)
Boolean::class -> bundle.putBoolean(key, it.second as Boolean) Boolean::class -> putBoolean(key, it.second as Boolean)
else -> Timber.e("Unhandled param: $it") else -> Timber.e("Unhandled param: $it")
}
} }
} })
analytics?.logEvent(context.getString(event), bundle)
} }
fun noChurn(): Boolean = remoteConfig?.getBoolean("no_churn") ?: false fun noChurn(): Boolean = remoteConfig?.getBoolean("no_churn") ?: false
init { init {
if (enabled) { if (preferences.isTrackingEnabled) {
analytics = FirebaseAnalytics.getInstance(context) analytics = FirebaseAnalytics.getInstance(context).apply {
analytics?.setAnalyticsCollectionEnabled(true) setAnalyticsCollectionEnabled(true)
Fabric.with(context, Crashlytics()) }
remoteConfig = FirebaseRemoteConfig.getInstance() crashlytics = FirebaseCrashlytics.getInstance().apply {
remoteConfig?.setConfigSettingsAsync(remoteConfigSettings { setCrashlyticsCollectionEnabled(true)
minimumFetchIntervalInSeconds = }
TimeUnit.HOURS.toSeconds(WorkManager.REMOTE_CONFIG_INTERVAL_HOURS) remoteConfig = FirebaseRemoteConfig.getInstance().apply {
}) setConfigSettingsAsync(remoteConfigSettings {
remoteConfig?.setDefaultsAsync(R.xml.remote_config_defaults) 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 work = "2.3.4"
const val leakcanary = "2.4" const val leakcanary = "2.4"
const val room = "2.2.5" const val room = "2.2.5"
const val crashlytics = "2.10.1" const val crashlytics = "17.2.1"
const val analytics = "17.4.4" const val analytics = "17.5.0"
const val remote_config = "19.1.4" const val remote_config = "19.2.0"
const val okhttp = "4.7.2" const val okhttp = "4.7.2"
const val flipper = "0.51.0" const val flipper = "0.51.0"
const val mockito = "3.3.3" const val mockito = "3.3.3"

Loading…
Cancel
Save