diff --git a/app/build.gradle b/app/build.gradle index ed10e2c2d..c2cc55943 100644 --- a/app/build.gradle +++ b/app/build.gradle @@ -241,8 +241,8 @@ dependencies { // For Firebase Crashlytics & Analytics googleImplementation platform('com.google.firebase:firebase-bom:32.7.1') - googleImplementation 'com.google.firebase:firebase-crashlytics-ktx' - googleImplementation 'com.google.firebase:firebase-analytics-ktx' + googleImplementation 'com.google.firebase:firebase-crashlytics' + googleImplementation 'com.google.firebase:firebase-analytics' // barcode support // per https://github.com/journeyapps/zxing-android-embedded#older-sdk-versions for minSdkVersion 21 diff --git a/app/src/fdroid/java/com/geeksville/mesh/analytics/FirebaseAnalytics.kt b/app/src/fdroid/java/com/geeksville/mesh/analytics/NopAnalytics.kt similarity index 71% rename from app/src/fdroid/java/com/geeksville/mesh/analytics/FirebaseAnalytics.kt rename to app/src/fdroid/java/com/geeksville/mesh/analytics/NopAnalytics.kt index c999cc7a3..d4e320076 100644 --- a/app/src/fdroid/java/com/geeksville/mesh/analytics/FirebaseAnalytics.kt +++ b/app/src/fdroid/java/com/geeksville/mesh/analytics/NopAnalytics.kt @@ -3,11 +3,19 @@ package com.geeksville.mesh.analytics import android.content.Context import com.geeksville.mesh.android.Logging +class DataPair(val name: String, valueIn: Any?) { + val value = valueIn ?: "null" + + /// An accumulating firebase event - only one allowed per event + constructor(d: Double) : this("BOGUS", d) + constructor(d: Int) : this("BOGUS", d) +} + /** * Implement our analytics API using Firebase Analytics */ @Suppress("UNUSED_PARAMETER") -class GoogleAnalytics(context: Context) : AnalyticsProvider, Logging { +class NopAnalytics(context: Context) : AnalyticsProvider, Logging { init { } diff --git a/app/src/fdroid/java/com/geeksville/mesh/android/GeeksvilleApplication.kt b/app/src/fdroid/java/com/geeksville/mesh/android/GeeksvilleApplication.kt index d55809549..66857d719 100644 --- a/app/src/fdroid/java/com/geeksville/mesh/android/GeeksvilleApplication.kt +++ b/app/src/fdroid/java/com/geeksville/mesh/android/GeeksvilleApplication.kt @@ -1,10 +1,8 @@ package com.geeksville.mesh.android -import android.app.Activity import android.app.Application import android.content.Context import android.content.SharedPreferences -import android.os.Bundle import android.provider.Settings import androidx.appcompat.app.AppCompatActivity import androidx.core.content.edit @@ -17,35 +15,6 @@ open class GeeksvilleApplication : Application(), Logging { companion object { lateinit var analytics: AnalyticsProvider - var currentActivity: Activity? = null - private val backstack = mutableListOf() - } - - private val lifecycleCallbacks = object : ActivityLifecycleCallbacks { - override fun onActivityPaused(activity: Activity) { - } - - override fun onActivityStarted(activity: Activity) { - } - - override fun onActivityDestroyed(activity: Activity) { - if (backstack.contains(activity)) backstack.remove(activity) - currentActivity = backstack.lastOrNull() - } - - override fun onActivitySaveInstanceState(activity: Activity, outState: Bundle) { - } - - override fun onActivityStopped(activity: Activity) { - } - - override fun onActivityCreated(activity: Activity, savedInstanceState: Bundle?) { - backstack.add(activity) - currentActivity = backstack.lastOrNull() - } - - override fun onActivityResumed(activity: Activity) { - } } /// Are we running inside the testlab? @@ -81,12 +50,8 @@ open class GeeksvilleApplication : Application(), Logging { override fun onCreate() { super.onCreate() - val googleAnalytics = com.geeksville.mesh.analytics.GoogleAnalytics(this) - analytics = googleAnalytics - - // Set analytics per prefs - isAnalyticsAllowed = isAnalyticsAllowed - - registerActivityLifecycleCallbacks(lifecycleCallbacks) + val nopAnalytics = com.geeksville.mesh.analytics.NopAnalytics(this) + analytics = nopAnalytics + isAnalyticsAllowed = false } } diff --git a/app/src/google/java/com/geeksville/mesh/MeshUtilApplication.kt b/app/src/google/java/com/geeksville/mesh/MeshUtilApplication.kt index e7687fcd2..8fa7c2c9d 100644 --- a/app/src/google/java/com/geeksville/mesh/MeshUtilApplication.kt +++ b/app/src/google/java/com/geeksville/mesh/MeshUtilApplication.kt @@ -6,7 +6,8 @@ import com.geeksville.mesh.android.BuildUtils.isEmulator import com.geeksville.mesh.android.GeeksvilleApplication import com.geeksville.mesh.android.Logging import com.geeksville.mesh.util.Exceptions -import com.google.firebase.crashlytics.FirebaseCrashlytics +import com.google.firebase.crashlytics.crashlytics +import com.google.firebase.Firebase import dagger.hilt.android.HiltAndroidApp @HiltAndroidApp @@ -20,7 +21,7 @@ class MeshUtilApplication : GeeksvilleApplication() { // We default to off in the manifest - we turn on here if the user approves // leave off when running in the debugger if (!isEmulator && (!BuildConfig.DEBUG || !Debug.isDebuggerConnected())) { - val crashlytics = FirebaseCrashlytics.getInstance() + val crashlytics = Firebase.crashlytics crashlytics.setCrashlyticsCollectionEnabled(isAnalyticsAllowed) crashlytics.setCustomKey("debug_build", BuildConfig.DEBUG) @@ -51,4 +52,4 @@ class MeshUtilApplication : GeeksvilleApplication() { } } } -} \ No newline at end of file +} diff --git a/app/src/google/java/com/geeksville/mesh/analytics/AnalyticsClient.kt b/app/src/google/java/com/geeksville/mesh/analytics/AnalyticsClient.kt deleted file mode 100644 index 9a0cb40f5..000000000 --- a/app/src/google/java/com/geeksville/mesh/analytics/AnalyticsClient.kt +++ /dev/null @@ -1,49 +0,0 @@ -package com.geeksville.mesh.analytics - -import com.google.firebase.analytics.FirebaseAnalytics - -/** - * Created by kevinh on 12/24/14. - */ -class DataPair(val name: String, valueIn: Any?) { - val value = valueIn ?: "null" - - /// An accumulating firebase event - only one allowed per event - constructor(d: Double) : this(FirebaseAnalytics.Param.VALUE, d) - constructor(d: Int) : this(FirebaseAnalytics.Param.VALUE, d) -} - -public interface AnalyticsProvider { - - // Turn analytics logging on/off - fun setEnabled(on: Boolean) - - /** - * Store an event - */ - fun track(event: String, vararg properties: DataPair): Unit - - /** - * Only track this event if using a cheap provider (like google) - */ - fun trackLowValue(event: String, vararg properties: DataPair): Unit - - fun endSession(): Unit - fun startSession(): Unit - - /** - * Set persistent ID info about this user, as a key value pair - */ - fun setUserInfo(vararg p: DataPair) - - /** - * Increment some sort of anyalytics counter - */ - fun increment(name: String, amount: Double = 1.0) - - fun sendScreenView(name: String) - fun endScreenView() - -} - - diff --git a/app/src/google/java/com/geeksville/mesh/analytics/FirebaseAnalytics.kt b/app/src/google/java/com/geeksville/mesh/analytics/FirebaseAnalytics.kt index af499e28f..4d2246e4a 100644 --- a/app/src/google/java/com/geeksville/mesh/analytics/FirebaseAnalytics.kt +++ b/app/src/google/java/com/geeksville/mesh/analytics/FirebaseAnalytics.kt @@ -3,15 +3,26 @@ package com.geeksville.mesh.analytics import android.content.Context import android.os.Bundle import com.geeksville.mesh.android.AppPrefs -import com.geeksville.mesh.android.GeeksvilleApplication import com.geeksville.mesh.android.Logging +import com.google.firebase.analytics.FirebaseAnalytics +import com.google.firebase.analytics.analytics +import com.google.firebase.analytics.logEvent +import com.google.firebase.Firebase + +class DataPair(val name: String, valueIn: Any?) { + val value = valueIn ?: "null" + + /// An accumulating firebase event - only one allowed per event + constructor(d: Double) : this(FirebaseAnalytics.Param.VALUE, d) + constructor(d: Int) : this(FirebaseAnalytics.Param.VALUE, d) +} /** * Implement our analytics API using Firebase Analytics */ -class GoogleAnalytics(context: Context) : AnalyticsProvider, Logging { +class FirebaseAnalytics(context: Context) : AnalyticsProvider, Logging { - val t = com.google.firebase.analytics.FirebaseAnalytics.getInstance(context) + val t = Firebase.analytics init { val pref = AppPrefs(context) @@ -65,14 +76,13 @@ class GoogleAnalytics(context: Context) : AnalyticsProvider, Logging { */ override fun sendScreenView(name: String) { debug("Analytics: start screen $name") - GeeksvilleApplication.currentActivity?.let { - t.setCurrentScreen( - it, name, null - ) + t.logEvent(FirebaseAnalytics.Event.SCREEN_VIEW) { + param(FirebaseAnalytics.Param.SCREEN_NAME, name) + param(FirebaseAnalytics.Param.SCREEN_CLASS, "MainActivity") } } override fun endScreenView() { // debug("Analytics: end screen") } -} \ No newline at end of file +} diff --git a/app/src/google/java/com/geeksville/mesh/android/GeeksvilleApplication.kt b/app/src/google/java/com/geeksville/mesh/android/GeeksvilleApplication.kt index 8966ac8ae..4c98cb571 100644 --- a/app/src/google/java/com/geeksville/mesh/android/GeeksvilleApplication.kt +++ b/app/src/google/java/com/geeksville/mesh/android/GeeksvilleApplication.kt @@ -1,10 +1,8 @@ package com.geeksville.mesh.android -import android.app.Activity import android.app.Application import android.content.Context import android.content.SharedPreferences -import android.os.Bundle import android.provider.Settings import androidx.appcompat.app.AppCompatActivity import androidx.core.content.edit @@ -28,35 +26,6 @@ open class GeeksvilleApplication : Application(), Logging { companion object { lateinit var analytics: AnalyticsProvider - var currentActivity: Activity? = null - private val backstack = mutableListOf() - } - - private val lifecycleCallbacks = object : ActivityLifecycleCallbacks { - override fun onActivityPaused(activity: Activity) { - } - - override fun onActivityStarted(activity: Activity) { - } - - override fun onActivityDestroyed(activity: Activity) { - if (backstack.contains(activity)) backstack.remove(activity) - currentActivity = backstack.lastOrNull() - } - - override fun onActivitySaveInstanceState(activity: Activity, outState: Bundle) { - } - - override fun onActivityStopped(activity: Activity) { - } - - override fun onActivityCreated(activity: Activity, savedInstanceState: Bundle?) { - backstack.add(activity) - currentActivity = backstack.lastOrNull() - } - - override fun onActivityResumed(activity: Activity) { - } } /// Are we running inside the testlab? @@ -100,12 +69,10 @@ open class GeeksvilleApplication : Application(), Logging { override fun onCreate() { super.onCreate() - val googleAnalytics = com.geeksville.mesh.analytics.GoogleAnalytics(this) - analytics = googleAnalytics + val firebaseAnalytics = com.geeksville.mesh.analytics.FirebaseAnalytics(this) + analytics = firebaseAnalytics // Set analytics per prefs isAnalyticsAllowed = isAnalyticsAllowed - - registerActivityLifecycleCallbacks(lifecycleCallbacks) } } diff --git a/app/src/fdroid/java/com/geeksville/mesh/analytics/AnalyticsClient.kt b/app/src/main/java/com/geeksville/mesh/analytics/AnalyticsClient.kt similarity index 66% rename from app/src/fdroid/java/com/geeksville/mesh/analytics/AnalyticsClient.kt rename to app/src/main/java/com/geeksville/mesh/analytics/AnalyticsClient.kt index 77326c266..a54a95251 100644 --- a/app/src/fdroid/java/com/geeksville/mesh/analytics/AnalyticsClient.kt +++ b/app/src/main/java/com/geeksville/mesh/analytics/AnalyticsClient.kt @@ -1,14 +1,9 @@ package com.geeksville.mesh.analytics -class DataPair(val name: String, valueIn: Any?) { - val value = valueIn ?: "null" - - /// An accumulating firebase event - only one allowed per event - constructor(d: Double) : this("BOGUS", d) - constructor(d: Int) : this("BOGUS", d) -} - -public interface AnalyticsProvider { +/** + * Created by kevinh on 12/24/14. + */ +interface AnalyticsProvider { // Turn analytics logging on/off fun setEnabled(on: Boolean) @@ -32,11 +27,10 @@ public interface AnalyticsProvider { fun setUserInfo(vararg p: DataPair) /** - * Increment some sort of anyalytics counter + * Increment some sort of analytics counter */ fun increment(name: String, amount: Double = 1.0) fun sendScreenView(name: String) fun endScreenView() - }