Convert to Firebase Analytics and Crashlytics

pull/685/merge
Alex Baker 8 years ago
parent db582a7732
commit 33bf34fe30

@ -1,5 +1,6 @@
apply plugin: 'com.android.application' apply plugin: 'com.android.application'
apply plugin: 'checkstyle' apply plugin: 'checkstyle'
apply plugin: 'io.fabric'
repositories { repositories {
jcenter() jcenter()
@ -108,7 +109,7 @@ configurations {
final DAGGER_VERSION = '2.9' final DAGGER_VERSION = '2.9'
final BUTTERKNIFE_VERSION = '8.8.1' final BUTTERKNIFE_VERSION = '8.8.1'
final GPS_VERSION = '12.0.1' final GPS_VERSION = '15.0.0'
final SUPPORT_VERSION = '27.1.1' final SUPPORT_VERSION = '27.1.1'
final ROOM_VERSION = '1.1.0-beta3' final ROOM_VERSION = '1.1.0-beta3'
final STETHO_VERSION = '1.5.0' final STETHO_VERSION = '1.5.0'
@ -169,8 +170,9 @@ dependencies {
implementation 'com.google.api-client:google-api-client-android:1.22.0' implementation 'com.google.api-client:google-api-client-android:1.22.0'
implementation 'com.android.billingclient:billing:1.0' implementation 'com.android.billingclient:billing:1.0'
googleplayImplementation 'com.crashlytics.sdk.android:crashlytics:2.9.1'
googleplayImplementation "com.google.firebase:firebase-core:${GPS_VERSION}"
googleplayImplementation "com.google.android.gms:play-services-location:${GPS_VERSION}" googleplayImplementation "com.google.android.gms:play-services-location:${GPS_VERSION}"
googleplayImplementation "com.google.android.gms:play-services-analytics:${GPS_VERSION}"
googleplayImplementation "com.google.android.gms:play-services-auth:${GPS_VERSION}" googleplayImplementation "com.google.android.gms:play-services-auth:${GPS_VERSION}"
googleplayImplementation "com.google.android.gms:play-services-places:${GPS_VERSION}" googleplayImplementation "com.google.android.gms:play-services-places:${GPS_VERSION}"
@ -184,3 +186,5 @@ dependencies {
androidTestImplementation "com.android.support.test:rules:${TESTING_SUPPORT_VERSION}" androidTestImplementation "com.android.support.test:rules:${TESTING_SUPPORT_VERSION}"
androidTestImplementation "com.android.support:support-annotations:${SUPPORT_VERSION}" androidTestImplementation "com.android.support:support-annotations:${SUPPORT_VERSION}"
} }
apply plugin: 'com.google.gms.google-services'

@ -0,0 +1,42 @@
{
"project_info": {
"project_number": "363426363175",
"firebase_url": "https://tasks-98543.firebaseio.com",
"project_id": "tasks-98543",
"storage_bucket": "tasks-98543.appspot.com"
},
"client": [
{
"client_info": {
"mobilesdk_app_id": "1:363426363175:android:9bc4739db40ecb39",
"android_client_info": {
"package_name": "org.tasks"
}
},
"oauth_client": [
{
"client_id": "363426363175-n0862rti6ect01fr3t4m229hqvvu1s8a.apps.googleusercontent.com",
"client_type": 3
}
],
"api_key": [
{
"current_key": "AIzaSyACOYpQZEIkpF2EykbufMOZXn9QVrP_5lI"
}
],
"services": {
"analytics_service": {
"status": 1
},
"appinvite_service": {
"status": 1,
"other_platform_oauth_client": []
},
"ads_service": {
"status": 2
}
}
}
],
"configuration_version": "1"
}

@ -1,4 +0,0 @@
<?xml version="1.0" encoding="utf-8"?>
<resources>
<string name="ga_trackingId">UA-71449238-1</string>
</resources>

@ -24,6 +24,10 @@
<application tools:ignore="GoogleAppIndexingWarning"> <application tools:ignore="GoogleAppIndexingWarning">
<meta-data
android:name="firebase_crashlytics_collection_enabled"
android:value="false"/>
<meta-data <meta-data
android:name="com.google.android.backup.api_key" android:name="com.google.android.backup.api_key"
android:value="AEdPqrEAAAAI49v5bBusi_bq1bgLBB1LIsepNV0eBrFkQrBZkw"/> android:value="AEdPqrEAAAAI49v5bBusi_bq1bgLBB1LIsepNV0eBrFkQrBZkw"/>

@ -3,70 +3,43 @@ package org.tasks.analytics;
import static org.tasks.billing.BillingClient.BillingResponseToString; import static org.tasks.billing.BillingClient.BillingResponseToString;
import android.content.Context; import android.content.Context;
import android.os.Bundle;
import com.android.billingclient.api.BillingClient.BillingResponse; import com.android.billingclient.api.BillingClient.BillingResponse;
import com.google.android.gms.analytics.ExceptionParser; import com.crashlytics.android.Crashlytics;
import com.google.android.gms.analytics.ExceptionReporter; import com.google.firebase.analytics.FirebaseAnalytics;
import com.google.android.gms.analytics.GoogleAnalytics; import com.google.firebase.analytics.FirebaseAnalytics.Event;
import com.google.android.gms.analytics.HitBuilders; import com.google.firebase.analytics.FirebaseAnalytics.Param;
import com.google.android.gms.analytics.StandardExceptionParser; import io.fabric.sdk.android.Fabric;
import com.google.common.base.Strings;
import javax.inject.Inject; import javax.inject.Inject;
import org.tasks.BuildConfig;
import org.tasks.R;
import org.tasks.injection.ApplicationScope; import org.tasks.injection.ApplicationScope;
import org.tasks.injection.ForApplication; import org.tasks.injection.ForApplication;
import org.tasks.preferences.Preferences;
import timber.log.Timber; import timber.log.Timber;
@ApplicationScope @ApplicationScope
public class Tracker { public class Tracker {
private final GoogleAnalytics analytics; private final FirebaseAnalytics analytics;
private final com.google.android.gms.analytics.Tracker tracker;
private final ExceptionParser exceptionParser;
private final Context context; private final Context context;
private final boolean enabled;
@Inject @Inject
public Tracker(@ForApplication Context context) { public Tracker(@ForApplication Context context, Preferences preferences) {
this.context = context; this.context = context;
analytics = GoogleAnalytics.getInstance(context); enabled = preferences.isTrackingEnabled();
tracker = analytics.newTracker(R.xml.google_analytics); if (enabled) {
tracker.setAppVersion(Integer.toString(BuildConfig.VERSION_CODE)); analytics = FirebaseAnalytics.getInstance(context);
final StandardExceptionParser standardExceptionParser = Fabric.with(context, new Crashlytics());
new StandardExceptionParser(context, null); } else {
exceptionParser = analytics = null;
(thread, throwable) -> { }
StringBuilder stack =
new StringBuilder()
.append(standardExceptionParser.getDescription(thread, throwable))
.append("\n")
.append(throwable.getClass().getName())
.append("\n");
for (StackTraceElement element : throwable.getStackTrace()) {
stack.append(element.toString()).append("\n");
}
return stack.toString();
};
ExceptionReporter reporter =
new ExceptionReporter(tracker, Thread.getDefaultUncaughtExceptionHandler(), context);
reporter.setExceptionParser(exceptionParser);
Thread.setDefaultUncaughtExceptionHandler(reporter);
}
public void setTrackingEnabled(boolean enabled) {
analytics.setAppOptOut(!enabled);
} }
public void reportException(Throwable t) { public void reportException(Throwable t) {
reportException(Thread.currentThread(), t);
}
public void reportException(Thread thread, Throwable t) {
Timber.e(t); Timber.e(t);
tracker.send( if (enabled) {
new HitBuilders.ExceptionBuilder() Crashlytics.logException(t);
.setDescription(exceptionParser.getDescription(thread.getName(), t)) }
.setFatal(false)
.build());
} }
public void reportEvent(Tracking.Events event) { public void reportEvent(Tracking.Events event) {
@ -85,21 +58,20 @@ public class Tracker {
reportEvent(event.category, action, label); reportEvent(event.category, action, label);
} }
private void reportEvent(int category, String action, String label) { private void reportEvent(int categoryRes, String action, String label) {
HitBuilders.EventBuilder eventBuilder = if (!enabled) {
new HitBuilders.EventBuilder().setCategory(context.getString(category)).setAction(action); return;
if (!Strings.isNullOrEmpty(label)) {
eventBuilder.setLabel(label);
} }
tracker.send(eventBuilder.build());
} }
public void reportIabResult(@BillingResponse int response, String sku) { public void reportIabResult(@BillingResponse int response, String sku) {
tracker.send( if (!enabled) {
new HitBuilders.EventBuilder() return;
.setCategory(context.getString(R.string.tracking_category_iab)) }
.setAction(sku)
.setLabel(BillingResponseToString(response)) Bundle bundle = new Bundle();
.build()); bundle.putString(Param.ITEM_ID, sku);
bundle.putString(Param.SUCCESS, BillingResponseToString(response));
analytics.logEvent(Event.ECOMMERCE_PURCHASE, bundle);
} }
} }

@ -1,40 +0,0 @@
package org.tasks;
import static java.util.concurrent.Executors.newSingleThreadExecutor;
import android.support.annotation.NonNull;
import com.google.common.util.concurrent.ThreadFactoryBuilder;
import java.util.concurrent.Executor;
import java.util.concurrent.ExecutorService;
import org.tasks.analytics.Tracker;
public class ErrorReportingSingleThreadExecutor
implements Executor, Thread.UncaughtExceptionHandler {
private final ExecutorService executorService;
private final Tracker tracker;
public ErrorReportingSingleThreadExecutor(String nameFormat, Tracker tracker) {
executorService =
newSingleThreadExecutor(
new ThreadFactoryBuilder()
.setNameFormat(String.format("%s-%%d", nameFormat))
.setUncaughtExceptionHandler(this)
.build());
this.tracker = tracker;
}
@Override
public void execute(@NonNull Runnable runnable) {
try {
executorService.execute(runnable);
} catch (Exception e) {
tracker.reportException(e);
}
}
@Override
public void uncaughtException(Thread thread, Throwable throwable) {
tracker.reportException(thread, throwable);
}
}

@ -3,7 +3,6 @@ package org.tasks;
import com.jakewharton.threetenabp.AndroidThreeTen; import com.jakewharton.threetenabp.AndroidThreeTen;
import com.todoroo.astrid.service.StartupService; import com.todoroo.astrid.service.StartupService;
import javax.inject.Inject; import javax.inject.Inject;
import org.tasks.analytics.Tracker;
import org.tasks.injection.ApplicationComponent; import org.tasks.injection.ApplicationComponent;
import org.tasks.injection.InjectingApplication; import org.tasks.injection.InjectingApplication;
import org.tasks.jobs.JobCreator; import org.tasks.jobs.JobCreator;
@ -16,7 +15,6 @@ public class Tasks extends InjectingApplication {
@Inject StartupService startupService; @Inject StartupService startupService;
@Inject Preferences preferences; @Inject Preferences preferences;
@Inject Tracker tracker;
@Inject FlavorSetup flavorSetup; @Inject FlavorSetup flavorSetup;
@Inject BuildSetup buildSetup; @Inject BuildSetup buildSetup;
@Inject ThemeCache themeCache; @Inject ThemeCache themeCache;
@ -28,8 +26,6 @@ public class Tasks extends InjectingApplication {
public void onCreate() { public void onCreate() {
super.onCreate(); super.onCreate();
tracker.setTrackingEnabled(preferences.isTrackingEnabled());
if (!buildSetup.setup()) { if (!buildSetup.setup()) {
return; return;
} }

@ -10,9 +10,6 @@ import com.todoroo.astrid.dao.TaskDao;
import com.todoroo.astrid.provider.Astrid2TaskProvider; import com.todoroo.astrid.provider.Astrid2TaskProvider;
import dagger.Module; import dagger.Module;
import dagger.Provides; import dagger.Provides;
import java.util.concurrent.Executor;
import javax.inject.Named;
import org.tasks.ErrorReportingSingleThreadExecutor;
import org.tasks.analytics.Tracker; import org.tasks.analytics.Tracker;
import org.tasks.data.AlarmDao; import org.tasks.data.AlarmDao;
import org.tasks.data.CaldavDao; import org.tasks.data.CaldavDao;
@ -53,13 +50,6 @@ public class ApplicationModule {
return context; return context;
} }
@Provides
@ApplicationScope
@Named("iab-executor")
public Executor getIabExecutor(Tracker tracker) {
return new ErrorReportingSingleThreadExecutor("iab-executor", tracker);
}
@Provides @Provides
@ApplicationScope @ApplicationScope
public Database getAppDatabase(Tracker tracker) { public Database getAppDatabase(Tracker tracker) {

@ -125,11 +125,8 @@ public class BasicPreferences extends InjectingPreferenceActivity
findPreference(getString(R.string.p_collect_statistics)) findPreference(getString(R.string.p_collect_statistics))
.setOnPreferenceChangeListener( .setOnPreferenceChangeListener(
(preference, newValue) -> { (preference, newValue) -> {
if (newValue != null) { showRestartDialog();
tracker.setTrackingEnabled((boolean) newValue); return true;
return true;
}
return false;
}); });
findPreference(R.string.backup_BAc_import) findPreference(R.string.backup_BAc_import)

@ -25,6 +25,7 @@ import java.util.Collection;
import java.util.concurrent.TimeUnit; import java.util.concurrent.TimeUnit;
import java.util.concurrent.atomic.AtomicReference; import java.util.concurrent.atomic.AtomicReference;
import javax.inject.Inject; import javax.inject.Inject;
import org.tasks.BuildConfig;
import org.tasks.R; import org.tasks.R;
import org.tasks.data.TaskAttachment; import org.tasks.data.TaskAttachment;
import org.tasks.injection.ForApplication; import org.tasks.injection.ForApplication;
@ -182,7 +183,7 @@ public class Preferences {
} }
public boolean isTrackingEnabled() { public boolean isTrackingEnabled() {
return getBoolean(R.string.p_collect_statistics, true); return !BuildConfig.DEBUG && getBoolean(R.string.p_collect_statistics, true);
} }
public String getDefaultCalendar() { public String getDefaultCalendar() {

@ -1,60 +0,0 @@
<?xml version="1.0" encoding="utf-8"?>
<!--suppress XmlUnboundNsPrefix -->
<resources>
<string name="ga_trackingId">UA-43015607-3</string>
<bool name="ga_autoActivityTracking">true</bool>
<screenName name="com.todoroo.astrid.activity.TaskEditActivity">TaskEditActivity</screenName>
<screenName name="com.todoroo.astrid.files.AACRecordingActivity">AACRecordingActivity</screenName>
<screenName name="org.tasks.activities.AddAttachmentActivity">AddAttachmentActivity</screenName>
<screenName name="org.tasks.widget.ShortcutConfigActivity">ShortcutConfigActivity</screenName>
<screenName name="com.todoroo.astrid.activity.ShareLinkActivity">ShareLinkActivity</screenName>
<screenName name="org.tasks.reminders.NotificationActivity">NotificationActivity</screenName>
<screenName name="org.tasks.files.MyFilePickerActivity">MyFilePickerActivity</screenName>
<screenName name="org.tasks.reminders.MissedCallActivity">MissedCallActivity</screenName>
<screenName name="com.todoroo.astrid.gtasks.auth.GtasksLoginActivity">GtasksLoginActivity
</screenName>
<screenName name="org.tasks.voice.VoiceCommandActivity">VoiceCommandActivity</screenName>
<screenName name="org.tasks.locale.ui.activity.TaskerSettingsActivity">TaskerSettingsActivity
</screenName>
<screenName name="com.todoroo.astrid.activity.TaskListActivity">TaskListActivity</screenName>
<screenName name="org.tasks.activities.TagSettingsActivity">TagSettingsActivity</screenName>
<screenName name="org.tasks.reminders.SnoozeActivity">SnoozeActivity</screenName>
<screenName name="com.todoroo.astrid.core.CustomFilterActivity">CustomFilterActivity</screenName>
<screenName name="org.tasks.activities.CameraActivity">CameraActivity</screenName>
<screenName name="org.tasks.activities.CalendarSelectionActivity">CalendarSelectionActivity
</screenName>
<screenName name="com.todoroo.astrid.gcal.CalendarReminderActivity">CalendarReminderActivity
</screenName>
<screenName name="com.todoroo.astrid.activity.BeastModePreferences">BeastModePreferences
</screenName>
<screenName name="org.tasks.activities.FilterSettingsActivity">FilterSettingsActivity</screenName>
<screenName name="org.tasks.activities.ColorPickerActivity">ColorPickerActivity</screenName>
<screenName name="org.tasks.activities.DateAndTimePickerActivity">DateAndTimePickerActivity
</screenName>
<screenName name="org.tasks.activities.DatePickerActivity">DatePickerActivity</screenName>
<screenName name="org.tasks.activities.FilterSelectionActivity">FilterSelectionActivity
</screenName>
<screenName name="org.tasks.activities.TimePickerActivity">TimePickerActivity</screenName>
<screenName name="org.tasks.files.FileExplore">FileExplore</screenName>
<screenName name="org.tasks.sync.SynchronizationPreferences">GtasksPreferences</screenName>
<screenName name="org.tasks.dashclock.DashClockSettings">DashClockSettings</screenName>
<screenName name="com.todoroo.astrid.core.DefaultsPreferences">DefaultsPreferences</screenName>
<screenName name="com.todoroo.astrid.core.OldTaskPreferences">OldTaskPreferences</screenName>
<screenName name="com.todoroo.astrid.reminders.ReminderPreferences">ReminderPreferences
</screenName>
<screenName name="org.tasks.preferences.AppearancePreferences">AppearancePreferences</screenName>
<screenName name="org.tasks.preferences.BackupPreferences">BackupPreferences</screenName>
<screenName name="org.tasks.preferences.BasicPreferences">BasicPreferences</screenName>
<screenName name="org.tasks.preferences.DateTimePreferences">DateShortcutPreferences</screenName>
<screenName name="org.tasks.preferences.HelpAndFeedbackActivity">HelpAndFeedbackActivity
</screenName>
<screenName name="org.tasks.preferences.MiscellaneousPreferences">MiscellaneousPreferences
</screenName>
<screenName name="org.tasks.widget.WidgetConfigActivity">WidgetConfigActivity</screenName>
<screenName name="org.tasks.caldav.CaldavCalendarSettingsActivity">CaldavSettingsActivity
</screenName>
<screenName name="org.tasks.caldav.CaldavAccountSettingsActivity">CaldavAccountSettingsActivity
</screenName>
<screenName name="org.tasks.billing.PurchaseActivity">PurchaseActivity</screenName>
</resources>

@ -6,9 +6,14 @@ buildscript {
repositories { repositories {
jcenter() jcenter()
google() google()
maven {
url 'https://maven.fabric.io/public'
}
} }
dependencies { dependencies {
classpath 'com.android.tools.build:gradle:3.1.2' classpath 'com.android.tools.build:gradle:3.1.2'
classpath 'com.google.gms:google-services:3.2.0'
classpath 'io.fabric.tools:gradle:1.25.1'
} }
} }

Loading…
Cancel
Save