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