From bc6a127dc86e9d334c785a69d9e2d1475d437102 Mon Sep 17 00:00:00 2001 From: Gustavo Martin Morcuende Date: Sun, 14 Dec 2014 20:47:11 +0100 Subject: [PATCH] Trying to use Google Analytics for caught and uncaught exceptions. --- app/build.gradle | 7 ++ app/src/main/AndroidManifest.xml | 3 + .../information/app/WeatherInformationApp.java | 94 ++++++++++++++++++++++ app/src/main/res/xml/exceptions_tracker.xml | 10 +++ app/src/main/res/xml/global_tracker.xml | 10 +++ 5 files changed, 124 insertions(+) create mode 100644 app/src/main/res/xml/exceptions_tracker.xml create mode 100644 app/src/main/res/xml/global_tracker.xml diff --git a/app/build.gradle b/app/build.gradle index 2a5029c..97ca02d 100644 --- a/app/build.gradle +++ b/app/build.gradle @@ -2,6 +2,12 @@ apply plugin: 'com.android.application' android { signingConfigs { + releaseSigning { + keyAlias '' + keyPassword '' + storeFile file('') + storePassword '' + } } compileSdkVersion 18 buildToolsVersion '21.1.1' @@ -18,6 +24,7 @@ android { minifyEnabled false proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.txt' buildConfigField "boolean", "DEBUG_MODE", "false" + signingConfig signingConfigs.releaseSigning } debug { buildConfigField "boolean", "DEBUG_MODE", "true" diff --git a/app/src/main/AndroidManifest.xml b/app/src/main/AndroidManifest.xml index 73297f4..4c156e8 100644 --- a/app/src/main/AndroidManifest.xml +++ b/app/src/main/AndroidManifest.xml @@ -171,6 +171,9 @@ + diff --git a/app/src/main/java/name/gumartinm/weather/information/app/WeatherInformationApp.java b/app/src/main/java/name/gumartinm/weather/information/app/WeatherInformationApp.java index dd4146a..cca8dcf 100644 --- a/app/src/main/java/name/gumartinm/weather/information/app/WeatherInformationApp.java +++ b/app/src/main/java/name/gumartinm/weather/information/app/WeatherInformationApp.java @@ -16,8 +16,17 @@ package name.gumartinm.weather.information.app; import android.app.Application; +import android.content.Context; + +import com.google.android.gms.analytics.GoogleAnalytics; +import com.google.android.gms.analytics.HitBuilders; +import com.google.android.gms.analytics.StandardExceptionParser; +import com.google.android.gms.analytics.Tracker; + +import java.util.HashMap; import name.gumartinm.weather.information.BuildConfig; +import name.gumartinm.weather.information.R; import timber.log.Timber; public class WeatherInformationApp extends Application { @@ -28,7 +37,92 @@ public class WeatherInformationApp extends Application { if (BuildConfig.DEBUG_MODE) { Timber.plant(new Timber.DebugTree()); + } else { + Timber.plant(new GoogleAnalyticsReportingTree( + new GoogleAnalyticsTrackers(this.getApplicationContext()))); } } + private static class GoogleAnalyticsTrackers { + + private enum TrackerName { + EXCEPTIONS_TRACKER, // Tracker used when logging caught exceptions in this app. + }; + + private final HashMap mTrackers = new HashMap(); + private final Context appContext; + + private GoogleAnalyticsTrackers(final Context appContext) { + this.appContext = appContext; + } + + /** + * Get tracker + * @param trackerId + * @return Tracker + */ + private synchronized Tracker getTracker(final TrackerName trackerId) { + if (!mTrackers.containsKey(trackerId)) { + + final GoogleAnalytics analytics = GoogleAnalytics.getInstance(appContext.getApplicationContext()); + + final Tracker t = (trackerId == TrackerName.EXCEPTIONS_TRACKER) ? + analytics.newTracker(R.xml.exceptions_tracker) : + analytics.newTracker(R.xml.exceptions_tracker); + + // Do not retrieve user's information. I strongly care about user's privacy. + t.enableAdvertisingIdCollection(false); + + mTrackers.put(trackerId, t); + } + return mTrackers.get(trackerId); + } + + /** + * Send exception + * @param exception + * @param trackerName + */ + private void send(final Throwable exception, final TrackerName trackerName) { + final Tracker tracker = this.getTracker(trackerName); + + // Build and send exception. + tracker.send(new HitBuilders.ExceptionBuilder() + .setDescription( + new StandardExceptionParser(appContext.getApplicationContext(), null) + .getDescription(Thread.currentThread().getName(), exception)) + .setFatal(false) + .build()); + } + } + + private static class GoogleAnalyticsReportingTree extends Timber.HollowTree { + private final GoogleAnalyticsTrackers analyticsTrackers; + + private GoogleAnalyticsReportingTree(final GoogleAnalyticsTrackers analyticsTrackers) { + this.analyticsTrackers = analyticsTrackers; + } + + @Override + public void i(final String message, final Object... args) { + // Do nothing, just report exceptions. + } + + @Override + public void i(final Throwable t, final String message, final Object... args) { + i(message, args); // Just add to the log. + } + + @Override + public void e(final String message, final Object... args) { + i("ERROR: " + message, args); // Just add to the log. + } + + @Override + public void e(final Throwable exception, final String message, final Object... args) { + e(message, args); + + this.analyticsTrackers.send(exception, GoogleAnalyticsTrackers.TrackerName.EXCEPTIONS_TRACKER); + } + } } diff --git a/app/src/main/res/xml/exceptions_tracker.xml b/app/src/main/res/xml/exceptions_tracker.xml new file mode 100644 index 0000000..8334404 --- /dev/null +++ b/app/src/main/res/xml/exceptions_tracker.xml @@ -0,0 +1,10 @@ + + + 300 + false + true + false + verbose + + diff --git a/app/src/main/res/xml/global_tracker.xml b/app/src/main/res/xml/global_tracker.xml new file mode 100644 index 0000000..6248311 --- /dev/null +++ b/app/src/main/res/xml/global_tracker.xml @@ -0,0 +1,10 @@ + + + 300 + false + true + true + verbose + + -- 2.1.4