diff --git a/.classpath b/.classpath index 968491105..c0d02d2e3 100644 --- a/.classpath +++ b/.classpath @@ -5,5 +5,6 @@ + diff --git a/AndroidManifest.xml b/AndroidManifest.xml index 6b81fc5d0..0aee18ba0 100644 --- a/AndroidManifest.xml +++ b/AndroidManifest.xml @@ -1,8 +1,8 @@ + android:versionCode="103" + android:versionName="2.8.3"> @@ -12,6 +12,10 @@ + + + + diff --git a/lib/FlurryAgent.jar b/lib/FlurryAgent.jar new file mode 100644 index 000000000..eddb7cde6 Binary files /dev/null and b/lib/FlurryAgent.jar differ diff --git a/src/com/timsu/astrid/activities/EditPreferences.java b/src/com/timsu/astrid/activities/EditPreferences.java index 0b06db10e..b222e91c3 100644 --- a/src/com/timsu/astrid/activities/EditPreferences.java +++ b/src/com/timsu/astrid/activities/EditPreferences.java @@ -22,7 +22,9 @@ package com.timsu.astrid.activities; import android.os.Bundle; import android.preference.PreferenceActivity; +import com.flurry.android.FlurryAgent; import com.timsu.astrid.R; +import com.timsu.astrid.utilities.Constants; /** * Displays the preference screen for users to edit their preferences @@ -37,4 +39,18 @@ public class EditPreferences extends PreferenceActivity { addPreferencesFromResource(R.xml.preferences); } + + @Override + protected void onStart() { + super.onStart(); + + // set up flurry + FlurryAgent.onStartSession(this, Constants.FLURRY_KEY); + } + + @Override + protected void onStop() { + super.onStop(); + FlurryAgent.onEndSession(this); + } } \ No newline at end of file diff --git a/src/com/timsu/astrid/activities/LocaleEditAlerts.java b/src/com/timsu/astrid/activities/LocaleEditAlerts.java index d1b3af1e4..49ec5ebc8 100644 --- a/src/com/timsu/astrid/activities/LocaleEditAlerts.java +++ b/src/com/timsu/astrid/activities/LocaleEditAlerts.java @@ -15,9 +15,11 @@ import android.widget.Spinner; import android.widget.TextView; import android.widget.AdapterView.OnItemSelectedListener; +import com.flurry.android.FlurryAgent; import com.timsu.astrid.R; import com.timsu.astrid.data.tag.TagController; import com.timsu.astrid.data.tag.TagModelForView; +import com.timsu.astrid.utilities.Constants; /** * Activity to edit alerts from Locale @@ -89,6 +91,20 @@ public final class LocaleEditAlerts extends Activity { }); } + @Override + protected void onStart() { + super.onStart(); + + // set up flurry + FlurryAgent.onStartSession(this, Constants.FLURRY_KEY); + } + + @Override + protected void onStop() { + super.onStop(); + FlurryAgent.onEndSession(this); + } + /** * Private helper method to persist the Toast message in the return {@code Intent}. */ diff --git a/src/com/timsu/astrid/activities/SyncLoginActivity.java b/src/com/timsu/astrid/activities/SyncLoginActivity.java index bf7b25151..82ceed514 100644 --- a/src/com/timsu/astrid/activities/SyncLoginActivity.java +++ b/src/com/timsu/astrid/activities/SyncLoginActivity.java @@ -118,8 +118,8 @@ public class SyncLoginActivity extends Activity { boolean result = callback.verifyLogin(handler); if(result) { TaskList.synchronizeNow = true; - finish(); } + finish(); } }).start(); } diff --git a/src/com/timsu/astrid/activities/SyncPreferences.java b/src/com/timsu/astrid/activities/SyncPreferences.java index 8c2bc8a77..d1ab669c4 100644 --- a/src/com/timsu/astrid/activities/SyncPreferences.java +++ b/src/com/timsu/astrid/activities/SyncPreferences.java @@ -32,6 +32,7 @@ import android.view.View; import android.widget.Button; import android.widget.TextView; +import com.flurry.android.FlurryAgent; import com.timsu.astrid.R; import com.timsu.astrid.sync.Synchronizer; import com.timsu.astrid.utilities.Constants; @@ -104,6 +105,20 @@ public class SyncPreferences extends PreferenceActivity { lastAutoSyncLabel.setVisibility(View.GONE); } + @Override + protected void onStart() { + super.onStart(); + + // set up flurry + FlurryAgent.onStartSession(this, Constants.FLURRY_KEY); + } + + @Override + protected void onStop() { + super.onStop(); + FlurryAgent.onEndSession(this); + } + @Override public boolean onKeyDown(int keyCode, KeyEvent event) { if(keyCode == KeyEvent.KEYCODE_BACK) { diff --git a/src/com/timsu/astrid/activities/TaskEdit.java b/src/com/timsu/astrid/activities/TaskEdit.java index 25f15220f..b4822bf61 100644 --- a/src/com/timsu/astrid/activities/TaskEdit.java +++ b/src/com/timsu/astrid/activities/TaskEdit.java @@ -60,6 +60,7 @@ import android.widget.Toast; import android.widget.ToggleButton; import android.widget.CompoundButton.OnCheckedChangeListener; +import com.flurry.android.FlurryAgent; import com.timsu.astrid.R; import com.timsu.astrid.data.alerts.AlertController; import com.timsu.astrid.data.enums.Importance; @@ -188,11 +189,14 @@ public class TaskEdit extends TaskModificationTabbedActivity { if(model.getCursor() != null) startManagingCursor(model.getCursor()); if(model.getTaskIdentifier() == null) { + FlurryAgent.onEvent("create-task"); Bundle extras = getIntent().getExtras(); if(extras != null && extras.containsKey(START_CHAR_TOKEN)) name.setText("" + extras.getChar(START_CHAR_TOKEN)); - } else + } else { + FlurryAgent.onEvent("edit-task"); name.setText(model.getName()); + } if(model.getName().length() > 0) setTitle(new StringBuilder(). append(r.getString(R.string.taskEdit_titlePrefix)). @@ -713,6 +717,8 @@ public class TaskEdit extends TaskModificationTabbedActivity { */ public static void createCalendarStartEndTimes(Date preferred, Date definite, Integer estimatedSeconds, ContentValues values) { + FlurryAgent.onEvent("create-calendar-event"); + Long deadlineDate = null; if (preferred != null && preferred.after(new Date())) deadlineDate = preferred.getTime(); diff --git a/src/com/timsu/astrid/activities/TaskList.java b/src/com/timsu/astrid/activities/TaskList.java index 987385e01..99b8b8044 100644 --- a/src/com/timsu/astrid/activities/TaskList.java +++ b/src/com/timsu/astrid/activities/TaskList.java @@ -34,6 +34,7 @@ import android.view.animation.Animation; import android.view.animation.AnimationUtils; import android.widget.ViewFlipper; +import com.flurry.android.FlurryAgent; import com.timsu.astrid.R; import com.timsu.astrid.data.tag.TagController; import com.timsu.astrid.data.task.TaskController; @@ -142,6 +143,20 @@ public class TaskList extends Activity { } } + @Override + protected void onStart() { + super.onStart(); + + // set up flurry + FlurryAgent.onStartSession(this, Constants.FLURRY_KEY); + } + + @Override + protected void onStop() { + super.onStop(); + FlurryAgent.onEndSession(this); + } + /** Set up user interface components */ private void setupUIComponents() { gestureDetector = new GestureDetector(new AstridGestureDetector()); diff --git a/src/com/timsu/astrid/activities/TaskListAdapter.java b/src/com/timsu/astrid/activities/TaskListAdapter.java index 6f021f9ca..cb34fbd2c 100644 --- a/src/com/timsu/astrid/activities/TaskListAdapter.java +++ b/src/com/timsu/astrid/activities/TaskListAdapter.java @@ -46,6 +46,7 @@ import android.widget.ImageView; import android.widget.ListView; import android.widget.TextView; +import com.flurry.android.FlurryAgent; import com.timsu.astrid.R; import com.timsu.astrid.data.alerts.AlertController; import com.timsu.astrid.data.enums.Importance; @@ -169,6 +170,9 @@ public class TaskListAdapter extends ArrayAdapter { view.requestFocus(); } } catch (Exception e) { + FlurryAgent.onError("task-adapter-set-expanded", e.toString(), + e.getClass().getSimpleName()); + Log.e("astrid", "Error in setExpanded", e); } } @@ -682,10 +686,13 @@ public class TaskListAdapter extends ArrayAdapter { hooks.taskController().saveTask(task); // show this task as completed even if it has repeats - if(progress == 100) + if(progress == 100) { recentlyCompleted = task; - else + FlurryAgent.onEvent("complete-task"); + } else { + FlurryAgent.onEvent("uncomplete-task"); recentlyCompleted = null; + } // if our timer is on, ask if we want to stop if(progress == 100 && task.getTimerStart() != null) { diff --git a/src/com/timsu/astrid/activities/TaskListSubActivity.java b/src/com/timsu/astrid/activities/TaskListSubActivity.java index 73a44436c..9e19eff63 100644 --- a/src/com/timsu/astrid/activities/TaskListSubActivity.java +++ b/src/com/timsu/astrid/activities/TaskListSubActivity.java @@ -50,6 +50,7 @@ import android.widget.ListView; import android.widget.TextView; import android.widget.Toast; +import com.flurry.android.FlurryAgent; import com.timsu.astrid.R; import com.timsu.astrid.activities.TaskListAdapter.TaskListAdapterHooks; import com.timsu.astrid.data.tag.TagController; @@ -233,6 +234,7 @@ public class TaskListSubActivity extends SubActivity { // open up reminder box if(variables != null && variables.containsKey(NOTIF_FLAGS_TOKEN) && context.selectedTask != null) { + FlurryAgent.onEvent("open-notification"); handler.post(new Runnable() { public void run() { long repeatInterval = 0; @@ -554,12 +556,20 @@ public class TaskListSubActivity extends SubActivity { if(task.isTaskCompleted()) completedTasks++; } + + HashMap args = new HashMap(); + args.put("tasks", Integer.toString(context.taskArray.size())); + FlurryAgent.onEvent("loaded-tasks", args); + } catch (StaleDataException e) { // happens when you rotate the screen while the thread is // still running. i don't think it's avoidable? Log.w("astrid", "StaleDataException", e); return; } catch (final IllegalStateException e) { + FlurryAgent.onError("task-list-error", e.toString(), + e.getClass().getSimpleName()); + // happens when you run out of memory usually Log.e("astrid", "Error loading task list", e); handler.post(new Runnable() { @@ -572,6 +582,9 @@ public class TaskListSubActivity extends SubActivity { }); return; } catch (final Exception e) { + FlurryAgent.onError("task-list-error", e.toString(), + e.getClass().getSimpleName()); + Log.e("astrid", "Error loading task list", e); return; } @@ -713,6 +726,8 @@ public class TaskListSubActivity extends SubActivity { context.listAdapter.setExpanded(v, context.selectedTask, true); listView.setSelection(selectedPosition); } catch (Exception e) { + FlurryAgent.onError("task-list-selected", e.toString(), + e.getClass().getSimpleName()); Log.e("astrid", "error with selected task", e); } } @@ -906,9 +921,11 @@ public class TaskListSubActivity extends SubActivity { /** Toggle the timer */ private void toggleTimer(TaskModelForList task) { - if(task.getTimerStart() == null) + if(task.getTimerStart() == null) { + FlurryAgent.onEvent("start-timer"); task.setTimerStart(new Date()); - else { + } else { + FlurryAgent.onEvent("stop-timer"); task.stopTimerAndUpdateElapsedTime(); } getTaskController().saveTask(task); @@ -988,6 +1005,8 @@ public class TaskListSubActivity extends SubActivity { /** Show a dialog box to postpone your tasks */ private void postponeTask(final TaskModelForList task) { + FlurryAgent.onEvent("postpone-task"); + final Resources r = getResources(); DialogUtilities.dayHourPicker(getParent(), r.getString(R.string.taskList_postpone_dialog), new OnNNumberPickedListener() { diff --git a/src/com/timsu/astrid/activities/TaskModificationActivity.java b/src/com/timsu/astrid/activities/TaskModificationActivity.java index 48223a632..f90435504 100644 --- a/src/com/timsu/astrid/activities/TaskModificationActivity.java +++ b/src/com/timsu/astrid/activities/TaskModificationActivity.java @@ -24,10 +24,12 @@ import android.content.DialogInterface; import android.content.res.Resources; import android.os.Bundle; +import com.flurry.android.FlurryAgent; import com.timsu.astrid.R; import com.timsu.astrid.data.task.AbstractTaskModel; import com.timsu.astrid.data.task.TaskController; import com.timsu.astrid.data.task.TaskIdentifier; +import com.timsu.astrid.utilities.Constants; import com.timsu.astrid.utilities.DialogUtilities; /** Abstract activity that operates on a single task. Use the generic parameter @@ -64,6 +66,20 @@ public abstract class TaskModificationActivity args = new HashMap(); + args.put("localCreatedTasks", Integer.toString(localCreatedTasks)); + args.put("localUpdatedTasks", Integer.toString(localUpdatedTasks)); + args.put("localDeletedTasks", Integer.toString(localDeletedTasks)); + args.put("mergedTasks", Integer.toString(mergedTasks)); + args.put("remoteCreatedTasks", Integer.toString(remoteCreatedTasks)); + args.put("remoteUpdatedTasks", Integer.toString(remoteUpdatedTasks)); + args.put("remoteDeletedTasks", Integer.toString(remoteDeletedTasks)); + FlurryAgent.onEvent("sync-finished", args); if(Preferences.shouldSuppressSyncDialogs(context) || getSingleTaskForSync() != null) { return; } + Resources r = context.getResources(); Dialog.OnClickListener finishListener = null; // nothing updated diff --git a/src/com/timsu/astrid/utilities/Constants.java b/src/com/timsu/astrid/utilities/Constants.java index 87e9e6b80..eb7511f76 100644 --- a/src/com/timsu/astrid/utilities/Constants.java +++ b/src/com/timsu/astrid/utilities/Constants.java @@ -13,6 +13,9 @@ public class Constants { /** URL of Astrid Feature Survey */ public static final String SURVEY_URL = "http://www.haveasec.com/survey/m/detail/welcome/bf25e0/"; + /** Flurry API KEy */ + public static final String FLURRY_KEY = "T3JAY9TV2JFMJR4YTG16"; + public static final boolean DEBUG = true; // result codes