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"