Added Flurry to track application usage statistics. Creating various logging points for errors and events, including creating, editing, postponing, completing tasks, synchronization, notifications.

pull/14/head
Tim Su 17 years ago
parent 32bd229c2c
commit e81012df05

@ -5,5 +5,6 @@
<classpathentry kind="con" path="com.android.ide.eclipse.adt.ANDROID_FRAMEWORK"/> <classpathentry kind="con" path="com.android.ide.eclipse.adt.ANDROID_FRAMEWORK"/>
<classpathentry kind="src" path="gen"/> <classpathentry kind="src" path="gen"/>
<classpathentry kind="lib" path="lib/locale_platform.jar"/> <classpathentry kind="lib" path="lib/locale_platform.jar"/>
<classpathentry kind="lib" path="lib/FlurryAgent.jar"/>
<classpathentry kind="output" path="bin"/> <classpathentry kind="output" path="bin"/>
</classpath> </classpath>

@ -1,8 +1,8 @@
<?xml version="1.0" encoding="utf-8"?> <?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android" <manifest xmlns:android="http://schemas.android.com/apk/res/android"
package="com.timsu.astrid" package="com.timsu.astrid"
android:versionCode="102" android:versionCode="103"
android:versionName="2.8.0"> android:versionName="2.8.3">
<!-- ============================ Metadata ============================ --> <!-- ============================ Metadata ============================ -->
@ -12,6 +12,10 @@
<uses-permission android:name="android.permission.READ_CALENDAR" /> <uses-permission android:name="android.permission.READ_CALENDAR" />
<uses-permission android:name="com.android.launcher.permission.INSTALL_SHORTCUT" /> <uses-permission android:name="com.android.launcher.permission.INSTALL_SHORTCUT" />
<!-- For Flurry analytics -->
<uses-permission android:name="android.permission.READ_PHONE_STATE" />
<uses-permission android:name="android.permission.ACCESS_COARSE_LOCATION" />
<uses-sdk android:minSdkVersion="1" /> <uses-sdk android:minSdkVersion="1" />
<application android:icon="@drawable/icon" android:label="@string/app_name"> <application android:icon="@drawable/icon" android:label="@string/app_name">

Binary file not shown.

@ -22,7 +22,9 @@ package com.timsu.astrid.activities;
import android.os.Bundle; import android.os.Bundle;
import android.preference.PreferenceActivity; import android.preference.PreferenceActivity;
import com.flurry.android.FlurryAgent;
import com.timsu.astrid.R; import com.timsu.astrid.R;
import com.timsu.astrid.utilities.Constants;
/** /**
* Displays the preference screen for users to edit their preferences * Displays the preference screen for users to edit their preferences
@ -37,4 +39,18 @@ public class EditPreferences extends PreferenceActivity {
addPreferencesFromResource(R.xml.preferences); 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);
}
} }

@ -15,9 +15,11 @@ import android.widget.Spinner;
import android.widget.TextView; import android.widget.TextView;
import android.widget.AdapterView.OnItemSelectedListener; import android.widget.AdapterView.OnItemSelectedListener;
import com.flurry.android.FlurryAgent;
import com.timsu.astrid.R; import com.timsu.astrid.R;
import com.timsu.astrid.data.tag.TagController; import com.timsu.astrid.data.tag.TagController;
import com.timsu.astrid.data.tag.TagModelForView; import com.timsu.astrid.data.tag.TagModelForView;
import com.timsu.astrid.utilities.Constants;
/** /**
* Activity to edit alerts from Locale * 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}. * Private helper method to persist the Toast message in the return {@code Intent}.
*/ */

@ -118,8 +118,8 @@ public class SyncLoginActivity extends Activity {
boolean result = callback.verifyLogin(handler); boolean result = callback.verifyLogin(handler);
if(result) { if(result) {
TaskList.synchronizeNow = true; TaskList.synchronizeNow = true;
finish();
} }
finish();
} }
}).start(); }).start();
} }

@ -32,6 +32,7 @@ import android.view.View;
import android.widget.Button; import android.widget.Button;
import android.widget.TextView; import android.widget.TextView;
import com.flurry.android.FlurryAgent;
import com.timsu.astrid.R; import com.timsu.astrid.R;
import com.timsu.astrid.sync.Synchronizer; import com.timsu.astrid.sync.Synchronizer;
import com.timsu.astrid.utilities.Constants; import com.timsu.astrid.utilities.Constants;
@ -104,6 +105,20 @@ public class SyncPreferences extends PreferenceActivity {
lastAutoSyncLabel.setVisibility(View.GONE); 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 @Override
public boolean onKeyDown(int keyCode, KeyEvent event) { public boolean onKeyDown(int keyCode, KeyEvent event) {
if(keyCode == KeyEvent.KEYCODE_BACK) { if(keyCode == KeyEvent.KEYCODE_BACK) {

@ -60,6 +60,7 @@ import android.widget.Toast;
import android.widget.ToggleButton; import android.widget.ToggleButton;
import android.widget.CompoundButton.OnCheckedChangeListener; import android.widget.CompoundButton.OnCheckedChangeListener;
import com.flurry.android.FlurryAgent;
import com.timsu.astrid.R; import com.timsu.astrid.R;
import com.timsu.astrid.data.alerts.AlertController; import com.timsu.astrid.data.alerts.AlertController;
import com.timsu.astrid.data.enums.Importance; import com.timsu.astrid.data.enums.Importance;
@ -188,11 +189,14 @@ public class TaskEdit extends TaskModificationTabbedActivity<TaskModelForEdit> {
if(model.getCursor() != null) if(model.getCursor() != null)
startManagingCursor(model.getCursor()); startManagingCursor(model.getCursor());
if(model.getTaskIdentifier() == null) { if(model.getTaskIdentifier() == null) {
FlurryAgent.onEvent("create-task");
Bundle extras = getIntent().getExtras(); Bundle extras = getIntent().getExtras();
if(extras != null && extras.containsKey(START_CHAR_TOKEN)) if(extras != null && extras.containsKey(START_CHAR_TOKEN))
name.setText("" + extras.getChar(START_CHAR_TOKEN)); name.setText("" + extras.getChar(START_CHAR_TOKEN));
} else } else {
FlurryAgent.onEvent("edit-task");
name.setText(model.getName()); name.setText(model.getName());
}
if(model.getName().length() > 0) if(model.getName().length() > 0)
setTitle(new StringBuilder(). setTitle(new StringBuilder().
append(r.getString(R.string.taskEdit_titlePrefix)). append(r.getString(R.string.taskEdit_titlePrefix)).
@ -713,6 +717,8 @@ public class TaskEdit extends TaskModificationTabbedActivity<TaskModelForEdit> {
*/ */
public static void createCalendarStartEndTimes(Date preferred, Date definite, public static void createCalendarStartEndTimes(Date preferred, Date definite,
Integer estimatedSeconds, ContentValues values) { Integer estimatedSeconds, ContentValues values) {
FlurryAgent.onEvent("create-calendar-event");
Long deadlineDate = null; Long deadlineDate = null;
if (preferred != null && preferred.after(new Date())) if (preferred != null && preferred.after(new Date()))
deadlineDate = preferred.getTime(); deadlineDate = preferred.getTime();

@ -34,6 +34,7 @@ import android.view.animation.Animation;
import android.view.animation.AnimationUtils; import android.view.animation.AnimationUtils;
import android.widget.ViewFlipper; import android.widget.ViewFlipper;
import com.flurry.android.FlurryAgent;
import com.timsu.astrid.R; import com.timsu.astrid.R;
import com.timsu.astrid.data.tag.TagController; import com.timsu.astrid.data.tag.TagController;
import com.timsu.astrid.data.task.TaskController; 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 */ /** Set up user interface components */
private void setupUIComponents() { private void setupUIComponents() {
gestureDetector = new GestureDetector(new AstridGestureDetector()); gestureDetector = new GestureDetector(new AstridGestureDetector());

@ -46,6 +46,7 @@ import android.widget.ImageView;
import android.widget.ListView; import android.widget.ListView;
import android.widget.TextView; import android.widget.TextView;
import com.flurry.android.FlurryAgent;
import com.timsu.astrid.R; import com.timsu.astrid.R;
import com.timsu.astrid.data.alerts.AlertController; import com.timsu.astrid.data.alerts.AlertController;
import com.timsu.astrid.data.enums.Importance; import com.timsu.astrid.data.enums.Importance;
@ -169,6 +170,9 @@ public class TaskListAdapter extends ArrayAdapter<TaskModelForList> {
view.requestFocus(); view.requestFocus();
} }
} catch (Exception e) { } catch (Exception e) {
FlurryAgent.onError("task-adapter-set-expanded", e.toString(),
e.getClass().getSimpleName());
Log.e("astrid", "Error in setExpanded", e); Log.e("astrid", "Error in setExpanded", e);
} }
} }
@ -682,10 +686,13 @@ public class TaskListAdapter extends ArrayAdapter<TaskModelForList> {
hooks.taskController().saveTask(task); hooks.taskController().saveTask(task);
// show this task as completed even if it has repeats // show this task as completed even if it has repeats
if(progress == 100) if(progress == 100) {
recentlyCompleted = task; recentlyCompleted = task;
else FlurryAgent.onEvent("complete-task");
} else {
FlurryAgent.onEvent("uncomplete-task");
recentlyCompleted = null; recentlyCompleted = null;
}
// if our timer is on, ask if we want to stop // if our timer is on, ask if we want to stop
if(progress == 100 && task.getTimerStart() != null) { if(progress == 100 && task.getTimerStart() != null) {

@ -50,6 +50,7 @@ import android.widget.ListView;
import android.widget.TextView; import android.widget.TextView;
import android.widget.Toast; import android.widget.Toast;
import com.flurry.android.FlurryAgent;
import com.timsu.astrid.R; import com.timsu.astrid.R;
import com.timsu.astrid.activities.TaskListAdapter.TaskListAdapterHooks; import com.timsu.astrid.activities.TaskListAdapter.TaskListAdapterHooks;
import com.timsu.astrid.data.tag.TagController; import com.timsu.astrid.data.tag.TagController;
@ -233,6 +234,7 @@ public class TaskListSubActivity extends SubActivity {
// open up reminder box // open up reminder box
if(variables != null && variables.containsKey(NOTIF_FLAGS_TOKEN) && if(variables != null && variables.containsKey(NOTIF_FLAGS_TOKEN) &&
context.selectedTask != null) { context.selectedTask != null) {
FlurryAgent.onEvent("open-notification");
handler.post(new Runnable() { handler.post(new Runnable() {
public void run() { public void run() {
long repeatInterval = 0; long repeatInterval = 0;
@ -554,12 +556,20 @@ public class TaskListSubActivity extends SubActivity {
if(task.isTaskCompleted()) if(task.isTaskCompleted())
completedTasks++; completedTasks++;
} }
HashMap<String, String> args = new HashMap<String, String>();
args.put("tasks", Integer.toString(context.taskArray.size()));
FlurryAgent.onEvent("loaded-tasks", args);
} catch (StaleDataException e) { } catch (StaleDataException e) {
// happens when you rotate the screen while the thread is // happens when you rotate the screen while the thread is
// still running. i don't think it's avoidable? // still running. i don't think it's avoidable?
Log.w("astrid", "StaleDataException", e); Log.w("astrid", "StaleDataException", e);
return; return;
} catch (final IllegalStateException e) { } catch (final IllegalStateException e) {
FlurryAgent.onError("task-list-error", e.toString(),
e.getClass().getSimpleName());
// happens when you run out of memory usually // happens when you run out of memory usually
Log.e("astrid", "Error loading task list", e); Log.e("astrid", "Error loading task list", e);
handler.post(new Runnable() { handler.post(new Runnable() {
@ -572,6 +582,9 @@ public class TaskListSubActivity extends SubActivity {
}); });
return; return;
} catch (final Exception e) { } catch (final Exception e) {
FlurryAgent.onError("task-list-error", e.toString(),
e.getClass().getSimpleName());
Log.e("astrid", "Error loading task list", e); Log.e("astrid", "Error loading task list", e);
return; return;
} }
@ -713,6 +726,8 @@ public class TaskListSubActivity extends SubActivity {
context.listAdapter.setExpanded(v, context.selectedTask, true); context.listAdapter.setExpanded(v, context.selectedTask, true);
listView.setSelection(selectedPosition); listView.setSelection(selectedPosition);
} catch (Exception e) { } catch (Exception e) {
FlurryAgent.onError("task-list-selected", e.toString(),
e.getClass().getSimpleName());
Log.e("astrid", "error with selected task", e); Log.e("astrid", "error with selected task", e);
} }
} }
@ -906,9 +921,11 @@ public class TaskListSubActivity extends SubActivity {
/** Toggle the timer */ /** Toggle the timer */
private void toggleTimer(TaskModelForList task) { private void toggleTimer(TaskModelForList task) {
if(task.getTimerStart() == null) if(task.getTimerStart() == null) {
FlurryAgent.onEvent("start-timer");
task.setTimerStart(new Date()); task.setTimerStart(new Date());
else { } else {
FlurryAgent.onEvent("stop-timer");
task.stopTimerAndUpdateElapsedTime(); task.stopTimerAndUpdateElapsedTime();
} }
getTaskController().saveTask(task); getTaskController().saveTask(task);
@ -988,6 +1005,8 @@ public class TaskListSubActivity extends SubActivity {
/** Show a dialog box to postpone your tasks */ /** Show a dialog box to postpone your tasks */
private void postponeTask(final TaskModelForList task) { private void postponeTask(final TaskModelForList task) {
FlurryAgent.onEvent("postpone-task");
final Resources r = getResources(); final Resources r = getResources();
DialogUtilities.dayHourPicker(getParent(), r.getString(R.string.taskList_postpone_dialog), DialogUtilities.dayHourPicker(getParent(), r.getString(R.string.taskList_postpone_dialog),
new OnNNumberPickedListener() { new OnNNumberPickedListener() {

@ -24,10 +24,12 @@ import android.content.DialogInterface;
import android.content.res.Resources; import android.content.res.Resources;
import android.os.Bundle; import android.os.Bundle;
import com.flurry.android.FlurryAgent;
import com.timsu.astrid.R; import com.timsu.astrid.R;
import com.timsu.astrid.data.task.AbstractTaskModel; import com.timsu.astrid.data.task.AbstractTaskModel;
import com.timsu.astrid.data.task.TaskController; import com.timsu.astrid.data.task.TaskController;
import com.timsu.astrid.data.task.TaskIdentifier; import com.timsu.astrid.data.task.TaskIdentifier;
import com.timsu.astrid.utilities.Constants;
import com.timsu.astrid.utilities.DialogUtilities; import com.timsu.astrid.utilities.DialogUtilities;
/** Abstract activity that operates on a single task. Use the generic parameter /** Abstract activity that operates on a single task. Use the generic parameter
@ -64,6 +66,20 @@ public abstract class TaskModificationActivity<MODEL_TYPE extends
} }
} }
@Override
protected void onStart() {
super.onStart();
// set up flurry
FlurryAgent.onStartSession(this, Constants.FLURRY_KEY);
}
@Override
protected void onStop() {
super.onStop();
FlurryAgent.onEndSession(this);
}
protected void showErrorAndFinish(int prefix, Throwable e) { protected void showErrorAndFinish(int prefix, Throwable e) {
Resources r = getResources(); Resources r = getResources();
DialogUtilities.okDialog(this, DialogUtilities.okDialog(this,

@ -24,10 +24,12 @@ import android.content.DialogInterface;
import android.content.res.Resources; import android.content.res.Resources;
import android.os.Bundle; import android.os.Bundle;
import com.flurry.android.FlurryAgent;
import com.timsu.astrid.R; import com.timsu.astrid.R;
import com.timsu.astrid.data.task.AbstractTaskModel; import com.timsu.astrid.data.task.AbstractTaskModel;
import com.timsu.astrid.data.task.TaskController; import com.timsu.astrid.data.task.TaskController;
import com.timsu.astrid.data.task.TaskIdentifier; import com.timsu.astrid.data.task.TaskIdentifier;
import com.timsu.astrid.utilities.Constants;
import com.timsu.astrid.utilities.DialogUtilities; import com.timsu.astrid.utilities.DialogUtilities;
/** Hack hack for tabbed activity. Should provide better interaction /** Hack hack for tabbed activity. Should provide better interaction
@ -63,6 +65,20 @@ public abstract class TaskModificationTabbedActivity<MODEL_TYPE extends
} }
} }
@Override
protected void onStart() {
super.onStart();
// set up flurry
FlurryAgent.onStartSession(this, Constants.FLURRY_KEY);
}
@Override
protected void onStop() {
super.onStop();
FlurryAgent.onEndSession(this);
}
protected void showErrorAndFinish(int prefix, Throwable e) { protected void showErrorAndFinish(int prefix, Throwable e) {
Resources r = getResources(); Resources r = getResources();
DialogUtilities.okDialog(this, DialogUtilities.okDialog(this,

@ -33,6 +33,7 @@ import android.content.res.Resources;
import android.os.Handler; import android.os.Handler;
import android.util.Log; import android.util.Log;
import com.flurry.android.FlurryAgent;
import com.mdt.rtm.ApplicationInfo; import com.mdt.rtm.ApplicationInfo;
import com.mdt.rtm.ServiceException; import com.mdt.rtm.ServiceException;
import com.mdt.rtm.ServiceImpl; import com.mdt.rtm.ServiceImpl;
@ -94,6 +95,7 @@ public class RTMSyncProvider extends SynchronizationProvider {
/** Perform authentication with RTM. Will open the SyncBrowser if necessary */ /** Perform authentication with RTM. Will open the SyncBrowser if necessary */
private void authenticate(final Context context) { private void authenticate(final Context context) {
final Resources r = context.getResources(); final Resources r = context.getResources();
FlurryAgent.onEvent("rtm-started");
try { try {
String apiKey = "bd9883b3384a21ead17501da38bb1e68"; String apiKey = "bd9883b3384a21ead17501da38bb1e68";
@ -128,6 +130,8 @@ public class RTMSyncProvider extends SynchronizationProvider {
if(isBackgroundService()) if(isBackgroundService())
return; return;
FlurryAgent.onEvent("rtm-login-dialog");
rtmService = new ServiceImpl(new ApplicationInfo( rtmService = new ServiceImpl(new ApplicationInfo(
apiKey, sharedSecret, appName)); apiKey, sharedSecret, appName));
final String url = rtmService.beginAuthorization(Perms.delete); final String url = rtmService.beginAuthorization(Perms.delete);
@ -149,6 +153,8 @@ public class RTMSyncProvider extends SynchronizationProvider {
return true; return true;
} catch (final Exception e) { } catch (final Exception e) {
// didn't work // didn't work
FlurryAgent.onError("rtm-error-verify-login", e.toString(),
e.getClass().getSimpleName());
syncLoginHandler.post(new Runnable() { syncLoginHandler.post(new Runnable() {
@Override @Override
@ -172,6 +178,9 @@ public class RTMSyncProvider extends SynchronizationProvider {
} }
} catch (Exception e) { } catch (Exception e) {
FlurryAgent.onError("rtm-error-authenticate", e.toString(),
e.getClass().getSimpleName());
// IO Exception // IO Exception
if(e instanceof ServiceInternalException && if(e instanceof ServiceInternalException &&
((ServiceInternalException)e).getEnclosedException() instanceof ((ServiceInternalException)e).getEnclosedException() instanceof
@ -249,6 +258,9 @@ public class RTMSyncProvider extends SynchronizationProvider {
postUpdate(new ProgressUpdater(5, 5)); postUpdate(new ProgressUpdater(5, 5));
addTasksToList(context, tasks, remoteChanges); addTasksToList(context, tasks, remoteChanges);
} catch (Exception e) { } catch (Exception e) {
FlurryAgent.onError("rtm-error-quick-sync", e.toString(),
e.getClass().getSimpleName());
Log.e("rtmsync", "Error sync-ing list!", e); Log.e("rtmsync", "Error sync-ing list!", e);
remoteChanges.clear(); remoteChanges.clear();
shouldSyncIndividualLists = true; shouldSyncIndividualLists = true;
@ -267,6 +279,9 @@ public class RTMSyncProvider extends SynchronizationProvider {
filter, lastSyncDate); filter, lastSyncDate);
addTasksToList(context, tasks, remoteChanges); addTasksToList(context, tasks, remoteChanges);
} catch (Exception e) { } catch (Exception e) {
FlurryAgent.onError("rtm-error-indiv-sync", e.toString(),
e.getClass().getSimpleName());
Log.e("rtmsync", "Error sync-ing list!", e); Log.e("rtmsync", "Error sync-ing list!", e);
postUpdate(new Runnable() { postUpdate(new Runnable() {
public void run() { public void run() {
@ -287,7 +302,12 @@ public class RTMSyncProvider extends SynchronizationProvider {
Date syncTime = new Date(System.currentTimeMillis() + 1000); Date syncTime = new Date(System.currentTimeMillis() + 1000);
Preferences.setSyncRTMLastSync(context, syncTime); Preferences.setSyncRTMLastSync(context, syncTime);
FlurryAgent.onEvent("rtm-sync-finished");
} catch (Exception e) { } catch (Exception e) {
FlurryAgent.onError("rtm-error-sync", e.toString(),
e.getClass().getSimpleName());
Log.e("rtmsync", "Error in synchronization", e); Log.e("rtmsync", "Error in synchronization", e);
showError(context, e, null); showError(context, e, null);

@ -31,6 +31,7 @@ import android.content.res.Resources;
import android.os.Handler; import android.os.Handler;
import android.util.Log; import android.util.Log;
import com.flurry.android.FlurryAgent;
import com.timsu.astrid.R; import com.timsu.astrid.R;
import com.timsu.astrid.data.alerts.AlertController; import com.timsu.astrid.data.alerts.AlertController;
import com.timsu.astrid.data.sync.SyncDataController; import com.timsu.astrid.data.sync.SyncDataController;
@ -300,6 +301,9 @@ public abstract class SynchronizationProvider {
else else
log.append("updated '" + task.getName() + "'\n"); log.append("updated '" + task.getName() + "'\n");
} catch (Exception e) { } catch (Exception e) {
FlurryAgent.onError("sync-error-push-task", e.toString(),
e.getClass().getSimpleName());
Log.e("astrid", "Exception pushing task", e); Log.e("astrid", "Exception pushing task", e);
log.append("error sending '" + task.getName() + "'\n"); log.append("error sending '" + task.getName() + "'\n");
continue; continue;
@ -512,13 +516,23 @@ public abstract class SynchronizationProvider {
/** Display a dialog with statistics */ /** Display a dialog with statistics */
public void showDialog(final Context context, String log) { public void showDialog(final Context context, String log) {
progressDialog.hide(); progressDialog.hide();
Resources r = context.getResources();
HashMap<String, String> args = new HashMap<String, String>();
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) || if(Preferences.shouldSuppressSyncDialogs(context) ||
getSingleTaskForSync() != null) { getSingleTaskForSync() != null) {
return; return;
} }
Resources r = context.getResources();
Dialog.OnClickListener finishListener = null; Dialog.OnClickListener finishListener = null;
// nothing updated // nothing updated

@ -13,6 +13,9 @@ public class Constants {
/** URL of Astrid Feature Survey */ /** URL of Astrid Feature Survey */
public static final String SURVEY_URL = "http://www.haveasec.com/survey/m/detail/welcome/bf25e0/"; 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; public static final boolean DEBUG = true;
// result codes // result codes

Loading…
Cancel
Save