Add google analytics

pull/384/head
Alex Baker 9 years ago
parent 6386b7ff3c
commit f69d0ae901

@ -27,8 +27,8 @@ android {
buildToolsVersion "23.0.2"
defaultConfig {
versionCode 379
versionName "4.7.22"
versionCode 380
versionName "4.8.0"
minSdkVersion 9
targetSdkVersion 23
}
@ -105,6 +105,7 @@ dependencies {
}
googleplayCompile 'com.google.android.gms:play-services-location:8.3.0'
googleplayCompile 'com.google.android.gms:play-services-analytics:8.3.0'
googleplayCompile('com.google.apis:google-api-services-tasks:v1-rev41-1.21.0') {
exclude group: 'org.apache.httpcomponents', module: 'httpclient'
}

@ -25,7 +25,8 @@
<application>
<meta-data android:name="com.google.android.gms.version"
<meta-data
android:name="com.google.android.gms.version"
android:value="@integer/google_play_services_version" />
<meta-data
@ -55,6 +56,31 @@
android:name=".scheduling.GtasksBackgroundService"
android:exported="false" />
<!-- Google Analytics -->
<receiver
android:name="com.google.android.gms.analytics.AnalyticsReceiver"
android:enabled="true">
<intent-filter>
<action android:name="com.google.android.gms.analytics.ANALYTICS_DISPATCH" />
</intent-filter>
</receiver>
<service
android:name="com.google.android.gms.analytics.AnalyticsService"
android:enabled="true"
android:exported="false" />
<receiver
android:name="com.google.android.gms.analytics.CampaignTrackingReceiver"
android:exported="true">
<intent-filter>
<action android:name="com.android.vending.INSTALL_REFERRER" />
</intent-filter>
</receiver>
<service android:name="com.google.android.gms.analytics.CampaignTrackingService" />
</application>
</manifest>

@ -0,0 +1,38 @@
package org.tasks.analytics;
import android.content.Context;
import com.google.android.gms.analytics.GoogleAnalytics;
import com.google.android.gms.analytics.HitBuilders;
import org.tasks.BuildConfig;
import org.tasks.R;
import org.tasks.injection.ForApplication;
import javax.inject.Inject;
import javax.inject.Singleton;
@Singleton
public class Tracker {
private final GoogleAnalytics analytics;
private final com.google.android.gms.analytics.Tracker tracker;
@Inject
public Tracker(@ForApplication Context context) {
analytics = GoogleAnalytics.getInstance(context);
tracker = analytics.newTracker(R.xml.analytics);
if (BuildConfig.DEBUG) {
analytics.setDryRun(true);
}
}
public void showScreen(String screenName) {
tracker.setScreenName(screenName);
tracker.send(new HitBuilders.ScreenViewBuilder().build());
}
public void setTrackingEnabled(boolean enabled) {
analytics.setAppOptOut(!enabled);
}
}

@ -0,0 +1,6 @@
<?xml version="1.0" encoding="utf-8"?>
<resources>
<string name="ga_trackingId">UA-43015607-3</string>
<bool name="ga_reportUncaughtExceptions">true</bool>
<integer name="ga_sessionTimeout">300</integer>
</resources>

@ -120,6 +120,10 @@
android:name=".activities.AddAttachmentActivity"
android:theme="@style/TranslucentDialog" />
<activity
android:name=".activities.PrivacyActivity"
android:theme="@style/TranslucentDialog" />
<!-- Activity that displays task list -->
<activity
android:name="com.todoroo.astrid.activity.TaskListActivity"

@ -5,7 +5,6 @@
*/
package com.todoroo.astrid.activity;
import android.app.Activity;
import android.content.ComponentName;
import android.content.ContentValues;
import android.content.Context;
@ -16,6 +15,8 @@ import com.todoroo.andlib.utility.AndroidUtilities;
import com.todoroo.astrid.api.Filter;
import com.todoroo.astrid.api.FilterWithCustomIntent;
import org.tasks.injection.InjectingAppCompatActivity;
import java.util.Map.Entry;
import java.util.Set;
@ -26,7 +27,7 @@ import java.util.Set;
* @author timsu
*
*/
public class ShortcutActivity extends Activity {
public class ShortcutActivity extends InjectingAppCompatActivity {
// --- constants

@ -168,7 +168,7 @@ public class TasksXmlExporter {
xml.startTag(null, BackupConstants.ASTRID_TAG);
xml.attribute(null, BackupConstants.ASTRID_ATTR_VERSION,
Integer.toString(preferences.getCurrentVersion()));
Integer.toString(preferences.getLastSetVersion()));
xml.attribute(null, BackupConstants.ASTRID_ATTR_FORMAT,
Integer.toString(FORMAT));

@ -117,13 +117,12 @@ public class StartupService {
// read current version
int latestSetVersion = 0;
try {
latestSetVersion = preferences.getCurrentVersion();
latestSetVersion = preferences.getLastSetVersion();
} catch (Exception e) {
log.error(e.getMessage(), e);
}
int version = BuildConfig.VERSION_CODE;
String versionName = BuildConfig.VERSION_NAME;
log.info("Astrid Startup. {} => {}", latestSetVersion, version);
@ -131,12 +130,11 @@ public class StartupService {
// invoke upgrade service
boolean justUpgraded = latestSetVersion != version;
if(justUpgraded && version > 0) {
if(justUpgraded) {
if(latestSetVersion > 0) {
upgradeService.performUpgrade(activity, latestSetVersion);
}
preferences.setCurrentVersion(version);
preferences.setCurrentVersionName(versionName);
}
initializeDatabaseListeners();
@ -189,7 +187,7 @@ public class StartupService {
*/
private void databaseRestoreIfEmpty(Context context) {
try {
if(preferences.getCurrentVersion() >= UpgradeService.V3_0_0 &&
if(preferences.getLastSetVersion() >= UpgradeService.V3_0_0 &&
!context.getDatabasePath(database.getName()).exists()) {
// we didn't have a database! restore latest file
File directory = preferences.getBackupDirectory();

@ -18,6 +18,7 @@ import com.todoroo.astrid.data.TaskAttachment;
import org.tasks.BuildConfig;
import org.tasks.R;
import org.tasks.activities.PrivacyActivity;
import org.tasks.dialogs.DialogBuilder;
import org.tasks.injection.InjectingAppCompatActivity;
import org.tasks.preferences.Preferences;
@ -70,7 +71,6 @@ public final class UpgradeService {
new Thread() {
@Override
public void run() {
//noinspection EmptyTryBlock
try {
if (from < V4_8_0) {
performMarshmallowMigration();
@ -99,7 +99,7 @@ public final class UpgradeService {
}
private void performMarshmallowMigration() {
// preserve pre-marshmallow default attachment and backup locations
// preserve pre-marshmallow default backup location
if (Environment.getExternalStorageState().equals(Environment.MEDIA_MOUNTED)) {
if (!preferences.isStringValueSet(R.string.p_backup_dir)) {
String directory = String.format("%s/astrid",
@ -109,18 +109,9 @@ public final class UpgradeService {
preferences.setString(R.string.p_backup_dir, directory);
}
}
if (!preferences.isStringValueSet(R.string.p_attachment_dir)) {
String directory = String.format("%s/Android/data/%s/files/%s",
Environment.getExternalStorageDirectory(),
BuildConfig.APPLICATION_ID,
TaskAttachment.FILES_DIRECTORY_DEFAULT);
File file = new File(directory);
if (file.exists() && file.isDirectory()) {
preferences.setString(R.string.p_attachment_dir, directory);
}
}
}
// notify existing users of analytics
startActivity(new Intent(this, PrivacyActivity.class));
}
}
}

@ -18,6 +18,7 @@ import com.todoroo.astrid.service.TaskService;
import com.todoroo.astrid.service.UpgradeService;
import com.todoroo.astrid.tags.TagService;
import org.tasks.analytics.Tracker;
import org.tasks.filters.FilterCounter;
import org.tasks.injection.InjectingApplication;
import org.tasks.preferences.Preferences;
@ -51,11 +52,14 @@ public class Tasks extends InjectingApplication {
@Inject RefreshScheduler refreshScheduler;
@Inject SyncThrottle syncThrottle;
@Inject Preferences preferences;
@Inject Tracker tracker;
@Override
public void onCreate() {
super.onCreate();
preferences.setupLogger();
tracker.setTrackingEnabled(preferences.isTrackingEnabled());
}
}

@ -0,0 +1,46 @@
package org.tasks.activities;
import android.content.DialogInterface;
import android.os.Bundle;
import org.tasks.R;
import org.tasks.analytics.Tracker;
import org.tasks.dialogs.DialogBuilder;
import org.tasks.injection.InjectingAppCompatActivity;
import org.tasks.preferences.Preferences;
import javax.inject.Inject;
public class PrivacyActivity extends InjectingAppCompatActivity {
@Inject DialogBuilder dialogBuilder;
@Inject Tracker tracker;
@Inject Preferences preferences;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
dialogBuilder.newDialog()
.setCancelable(false)
.setTitle(R.string.send_anonymous_statistics)
.setMessage(String.format("%s\n\n%s",
getString(R.string.send_anonymous_statistics_summary),
getString(R.string.change_setting_anytime)))
.setPositiveButton(android.R.string.ok, new DialogInterface.OnClickListener() {
@Override
public void onClick(DialogInterface dialog, int which) {
finish();
}
})
.setNegativeButton(R.string.opt_out, new DialogInterface.OnClickListener() {
@Override
public void onClick(DialogInterface dialog, int which) {
preferences.setTrackingEnabled(false);
tracker.setTrackingEnabled(false);
finish();
}
})
.show();
}
}

@ -7,6 +7,7 @@ import com.todoroo.astrid.actfm.TagSettingsActivity;
import com.todoroo.astrid.activity.BeastModePreferences;
import com.todoroo.astrid.activity.FilterShortcutActivity;
import com.todoroo.astrid.activity.ShareLinkActivity;
import com.todoroo.astrid.activity.ShortcutActivity;
import com.todoroo.astrid.activity.TaskEditActivity;
import com.todoroo.astrid.activity.TaskListActivity;
import com.todoroo.astrid.core.CustomFilterActivity;
@ -34,6 +35,7 @@ import org.tasks.activities.ExportTaskActivity;
import org.tasks.activities.FilterSelectionActivity;
import org.tasks.activities.ImportTaskActivity;
import org.tasks.activities.LocationPickerActivity;
import org.tasks.activities.PrivacyActivity;
import org.tasks.activities.PurgeDeletedActivity;
import org.tasks.activities.ResetPreferencesActivity;
import org.tasks.activities.SortActivity;
@ -98,7 +100,9 @@ import dagger.Provides;
DonationActivity.class,
UpgradeService.UpgradeActivity.class,
CalendarSelectionActivity.class,
AddAttachmentActivity.class
AddAttachmentActivity.class,
ShortcutActivity.class,
PrivacyActivity.class
})
public class ActivityModule {

@ -3,11 +3,17 @@ package org.tasks.injection;
import android.os.Bundle;
import android.support.v7.app.AppCompatActivity;
import org.tasks.analytics.Tracker;
import javax.inject.Inject;
import dagger.ObjectGraph;
public abstract class InjectingAppCompatActivity extends AppCompatActivity implements Injector {
private ObjectGraph objectGraph;
@Inject Tracker tracker;
@Override
protected void onCreate(Bundle savedInstanceState) {
objectGraph = ((Injector) getApplication()).getObjectGraph().plus(new ActivityModule(this));
@ -16,6 +22,13 @@ public abstract class InjectingAppCompatActivity extends AppCompatActivity imple
super.onCreate(savedInstanceState);
}
@Override
protected void onResume() {
super.onResume();
tracker.showScreen(getClass().getSimpleName());
}
@Override
public void inject(Object caller) {
objectGraph.inject(caller);

@ -3,11 +3,17 @@ package org.tasks.injection;
import android.app.ListActivity;
import android.os.Bundle;
import org.tasks.analytics.Tracker;
import javax.inject.Inject;
import dagger.ObjectGraph;
public abstract class InjectingListActivity extends ListActivity implements Injector {
private ObjectGraph objectGraph;
@Inject Tracker tracker;
@Override
protected void onCreate(Bundle savedInstanceState) {
objectGraph = ((Injector) getApplication()).getObjectGraph().plus(new ActivityModule(this));
@ -25,4 +31,11 @@ public abstract class InjectingListActivity extends ListActivity implements Inje
public ObjectGraph getObjectGraph() {
return objectGraph;
}
@Override
protected void onResume() {
super.onResume();
tracker.showScreen(getClass().getSimpleName());
}
}

@ -9,6 +9,7 @@ import android.view.ViewGroup;
import android.widget.LinearLayout;
import org.tasks.R;
import org.tasks.analytics.Tracker;
import org.tasks.preferences.ActivityPreferences;
import org.tasks.preferences.AppCompatPreferenceActivity;
@ -22,8 +23,8 @@ public abstract class InjectingPreferenceActivity extends AppCompatPreferenceAct
protected Toolbar toolbar;
@Inject
ActivityPreferences activityPreferences;
@Inject ActivityPreferences activityPreferences;
@Inject Tracker tracker;
@Override
public void onCreate(Bundle savedInstanceState) {
@ -64,4 +65,11 @@ public abstract class InjectingPreferenceActivity extends AppCompatPreferenceAct
public ObjectGraph getObjectGraph() {
return objectGraph;
}
@Override
protected void onResume() {
super.onResume();
tracker.showScreen(getClass().getSimpleName());
}
}

@ -44,7 +44,6 @@ public class Preferences {
private static final Logger log = LoggerFactory.getLogger(Preferences.class);
private static final String P_CURRENT_VERSION = "cv"; //$NON-NLS-1$
private static final String P_CURRENT_VERSION_NAME = "cvname"; //$NON-NLS-1$
private static final String PREF_SORT_SORT = "sort_sort"; //$NON-NLS-1$
@ -101,6 +100,14 @@ public class Preferences {
return defaultCalendar != null && !defaultCalendar.equals("-1") && !defaultCalendar.equals("0");
}
public void setTrackingEnabled(boolean enabled) {
setBoolean(R.string.p_collect_statistics, enabled);
}
public boolean isTrackingEnabled() {
return getBoolean(R.string.p_collect_statistics, true);
}
public int getNotificationPriority() {
return getIntegerFromString(R.string.p_notification_priority, 1);
}
@ -256,7 +263,7 @@ public class Preferences {
editor.commit();
}
public int getCurrentVersion() {
public int getLastSetVersion() {
return getInt(P_CURRENT_VERSION, 0);
}
@ -264,10 +271,6 @@ public class Preferences {
setInt(P_CURRENT_VERSION, version);
}
public void setCurrentVersionName(String versionName) {
setString(P_CURRENT_VERSION_NAME, versionName);
}
public int getSortMode() {
return publicPrefs.getInt(PREF_SORT_SORT, SortHelper.SORT_AUTO);
}

@ -282,5 +282,6 @@
<string name="default_vibration_count">3</string>
<string name="default_vibration_duration">1000</string>
<string name="default_vibration_pause">500</string>
<string name="p_collect_statistics">collect_statistics</string>
</resources>

@ -134,6 +134,10 @@
<string name="pick_from_storage">Pick from storage</string>
<string name="privacy">Privacy</string>
<string name="privacy_policy">Privacy policy</string>
<string name="send_anonymous_statistics">Improve Tasks</string>
<string name="send_anonymous_statistics_summary">Send anonymous usage statistics and crash reports to help improve Tasks. No personal data will be collected.</string>
<string name="opt_out">Opt-out</string>
<string name="change_setting_anytime">You can change this setting at any time.</string>
<string-array name="sync_SPr_interval_entries">
<!-- sync_SPr_interval_entries: Synchronization Intervals -->

@ -46,11 +46,19 @@
</Preference>
<PreferenceCategory android:title="@string/privacy">
<Preference android:title="@string/privacy_policy">
<intent
android:action="android.intent.action.VIEW"
android:data="http://tasks.org/privacy.html" />
</Preference>
<com.todoroo.astrid.ui.MultilineCheckboxPreference
android:defaultValue="true"
android:key="@string/p_collect_statistics"
android:summary="@string/send_anonymous_statistics_summary"
android:title="@string/send_anonymous_statistics" />
</PreferenceCategory>
</PreferenceScreen>
Loading…
Cancel
Save