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: 'checkstyle'
apply plugin: 'io.fabric'
repositories {
jcenter()
@ -108,7 +109,7 @@ configurations {
final DAGGER_VERSION = '2.9'
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 ROOM_VERSION = '1.1.0-beta3'
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.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-analytics:${GPS_VERSION}"
googleplayImplementation "com.google.android.gms:play-services-auth:${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: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">
<meta-data
android:name="firebase_crashlytics_collection_enabled"
android:value="false"/>
<meta-data
android:name="com.google.android.backup.api_key"
android:value="AEdPqrEAAAAI49v5bBusi_bq1bgLBB1LIsepNV0eBrFkQrBZkw"/>

@ -3,70 +3,43 @@ package org.tasks.analytics;
import static org.tasks.billing.BillingClient.BillingResponseToString;
import android.content.Context;
import android.os.Bundle;
import com.android.billingclient.api.BillingClient.BillingResponse;
import com.google.android.gms.analytics.ExceptionParser;
import com.google.android.gms.analytics.ExceptionReporter;
import com.google.android.gms.analytics.GoogleAnalytics;
import com.google.android.gms.analytics.HitBuilders;
import com.google.android.gms.analytics.StandardExceptionParser;
import com.google.common.base.Strings;
import com.crashlytics.android.Crashlytics;
import com.google.firebase.analytics.FirebaseAnalytics;
import com.google.firebase.analytics.FirebaseAnalytics.Event;
import com.google.firebase.analytics.FirebaseAnalytics.Param;
import io.fabric.sdk.android.Fabric;
import javax.inject.Inject;
import org.tasks.BuildConfig;
import org.tasks.R;
import org.tasks.injection.ApplicationScope;
import org.tasks.injection.ForApplication;
import org.tasks.preferences.Preferences;
import timber.log.Timber;
@ApplicationScope
public class Tracker {
private final GoogleAnalytics analytics;
private final com.google.android.gms.analytics.Tracker tracker;
private final ExceptionParser exceptionParser;
private final FirebaseAnalytics analytics;
private final Context context;
private final boolean enabled;
@Inject
public Tracker(@ForApplication Context context) {
public Tracker(@ForApplication Context context, Preferences preferences) {
this.context = context;
analytics = GoogleAnalytics.getInstance(context);
tracker = analytics.newTracker(R.xml.google_analytics);
tracker.setAppVersion(Integer.toString(BuildConfig.VERSION_CODE));
final StandardExceptionParser standardExceptionParser =
new StandardExceptionParser(context, null);
exceptionParser =
(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);
enabled = preferences.isTrackingEnabled();
if (enabled) {
analytics = FirebaseAnalytics.getInstance(context);
Fabric.with(context, new Crashlytics());
} else {
analytics = null;
}
}
public void reportException(Throwable t) {
reportException(Thread.currentThread(), t);
}
public void reportException(Thread thread, Throwable t) {
Timber.e(t);
tracker.send(
new HitBuilders.ExceptionBuilder()
.setDescription(exceptionParser.getDescription(thread.getName(), t))
.setFatal(false)
.build());
if (enabled) {
Crashlytics.logException(t);
}
}
public void reportEvent(Tracking.Events event) {
@ -85,21 +58,20 @@ public class Tracker {
reportEvent(event.category, action, label);
}
private void reportEvent(int category, String action, String label) {
HitBuilders.EventBuilder eventBuilder =
new HitBuilders.EventBuilder().setCategory(context.getString(category)).setAction(action);
if (!Strings.isNullOrEmpty(label)) {
eventBuilder.setLabel(label);
private void reportEvent(int categoryRes, String action, String label) {
if (!enabled) {
return;
}
tracker.send(eventBuilder.build());
}
public void reportIabResult(@BillingResponse int response, String sku) {
tracker.send(
new HitBuilders.EventBuilder()
.setCategory(context.getString(R.string.tracking_category_iab))
.setAction(sku)
.setLabel(BillingResponseToString(response))
.build());
if (!enabled) {
return;
}
Bundle bundle = new Bundle();
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.todoroo.astrid.service.StartupService;
import javax.inject.Inject;
import org.tasks.analytics.Tracker;
import org.tasks.injection.ApplicationComponent;
import org.tasks.injection.InjectingApplication;
import org.tasks.jobs.JobCreator;
@ -16,7 +15,6 @@ public class Tasks extends InjectingApplication {
@Inject StartupService startupService;
@Inject Preferences preferences;
@Inject Tracker tracker;
@Inject FlavorSetup flavorSetup;
@Inject BuildSetup buildSetup;
@Inject ThemeCache themeCache;
@ -28,8 +26,6 @@ public class Tasks extends InjectingApplication {
public void onCreate() {
super.onCreate();
tracker.setTrackingEnabled(preferences.isTrackingEnabled());
if (!buildSetup.setup()) {
return;
}

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

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

@ -25,6 +25,7 @@ import java.util.Collection;
import java.util.concurrent.TimeUnit;
import java.util.concurrent.atomic.AtomicReference;
import javax.inject.Inject;
import org.tasks.BuildConfig;
import org.tasks.R;
import org.tasks.data.TaskAttachment;
import org.tasks.injection.ForApplication;
@ -182,7 +183,7 @@ public class Preferences {
}
public boolean isTrackingEnabled() {
return getBoolean(R.string.p_collect_statistics, true);
return !BuildConfig.DEBUG && getBoolean(R.string.p_collect_statistics, true);
}
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 {
jcenter()
google()
maven {
url 'https://maven.fabric.io/public'
}
}
dependencies {
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