diff --git a/astrid/src/com/todoroo/astrid/activity/AstridActivity.java b/astrid/src/com/todoroo/astrid/activity/AstridActivity.java index e7ce1b5c4..6f2ed2872 100644 --- a/astrid/src/com/todoroo/astrid/activity/AstridActivity.java +++ b/astrid/src/com/todoroo/astrid/activity/AstridActivity.java @@ -96,6 +96,8 @@ public class AstridActivity extends FragmentActivity protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); ContextManager.setContext(this); + StatisticsService.sessionStart(this); + new StartupService().onStartupApplication(this); } @@ -115,10 +117,18 @@ public class AstridActivity extends FragmentActivity @Override protected void onPause() { super.onPause(); + + StatisticsService.sessionPause(); AndroidUtilities.tryUnregisterReceiver(this, reminderReceiver); AndroidUtilities.tryUnregisterReceiver(this, repeatConfirmationReceiver); } + @Override + protected void onStop() { + super.onStop(); + StatisticsService.sessionStop(this); + } + /** * Handles items being clicked from the filterlist-fragment. Return true if item is handled. */ diff --git a/astrid/src/com/todoroo/astrid/activity/TaskListActivity.java b/astrid/src/com/todoroo/astrid/activity/TaskListActivity.java index 24111b527..4866e8d4b 100644 --- a/astrid/src/com/todoroo/astrid/activity/TaskListActivity.java +++ b/astrid/src/com/todoroo/astrid/activity/TaskListActivity.java @@ -29,6 +29,7 @@ import com.timsu.astrid.R; import com.todoroo.andlib.sql.Functions; import com.todoroo.andlib.sql.QueryTemplate; import com.todoroo.andlib.utility.AndroidUtilities; +import com.todoroo.andlib.utility.DateUtilities; import com.todoroo.andlib.utility.DialogUtilities; import com.todoroo.andlib.utility.Preferences; import com.todoroo.astrid.actfm.TagSettingsActivity; @@ -51,6 +52,7 @@ import com.todoroo.astrid.ui.FragmentPopover; import com.todoroo.astrid.ui.MainMenuPopover; import com.todoroo.astrid.ui.MainMenuPopover.MainMenuListener; import com.todoroo.astrid.ui.TaskListFragmentPager; +import com.todoroo.astrid.utility.AstridPreferences; import com.todoroo.astrid.utility.Constants; import com.todoroo.astrid.utility.Flags; @@ -198,12 +200,34 @@ public class TaskListActivity extends AstridActivity implements MainMenuListener if (getIntent().hasExtra(TOKEN_SOURCE)) { trackActivitySource(); } + + trackUserRetention(); } private boolean swipeIsEnabled() { return fragmentLayout == LAYOUT_SINGLE && swipeEnabled; } + private void trackUserRetention() { + long firstLaunchTime = Preferences.getLong(AstridPreferences.P_FIRST_LAUNCH, 0); + long now = DateUtilities.now(); + long timeSinceFirst = now - firstLaunchTime; + + if (timeSinceFirst < DateUtilities.ONE_DAY * 3 && !Preferences.getBoolean(StatisticsConstants.APP_OPEN_THREE_DAYS, false)) { + StatisticsService.reportEvent(StatisticsConstants.APP_OPEN_THREE_DAYS); + Preferences.setBoolean(StatisticsConstants.APP_OPEN_THREE_DAYS, true); + } else if (timeSinceFirst < DateUtilities.ONE_WEEK && !Preferences.getBoolean(StatisticsConstants.APP_OPEN_ONE_WEEK, false)) { + StatisticsService.reportEvent(StatisticsConstants.APP_OPEN_ONE_WEEK); + Preferences.setBoolean(StatisticsConstants.APP_OPEN_ONE_WEEK, true); + } else if (timeSinceFirst < 2 * DateUtilities.ONE_WEEK && !Preferences.getBoolean(StatisticsConstants.APP_OPEN_TWO_WEEKS, false)) { + StatisticsService.reportEvent(StatisticsConstants.APP_OPEN_TWO_WEEKS); + Preferences.setBoolean(StatisticsConstants.APP_OPEN_TWO_WEEKS, true); + } else if (timeSinceFirst < 3 * DateUtilities.ONE_WEEK && !Preferences.getBoolean(StatisticsConstants.APP_OPEN_THREE_WEEKS, false)) { + StatisticsService.reportEvent(StatisticsConstants.APP_OPEN_THREE_WEEKS); + Preferences.setBoolean(StatisticsConstants.APP_OPEN_THREE_WEEKS, true); + } + } + @Override public TaskListFragment getTaskListFragment() { if (swipeIsEnabled()) { diff --git a/astrid/src/com/todoroo/astrid/activity/TaskListFragment.java b/astrid/src/com/todoroo/astrid/activity/TaskListFragment.java index 3bb6343e2..52df586e7 100644 --- a/astrid/src/com/todoroo/astrid/activity/TaskListFragment.java +++ b/astrid/src/com/todoroo/astrid/activity/TaskListFragment.java @@ -578,7 +578,6 @@ public class TaskListFragment extends ListFragment implements OnScrollListener, @Override public void onStop() { - StatisticsService.sessionStop(getActivity()); super.onStop(); } @@ -586,8 +585,6 @@ public class TaskListFragment extends ListFragment implements OnScrollListener, public void onResume() { super.onResume(); - StatisticsService.sessionStart(getActivity()); - getActivity().registerReceiver(detailReceiver, new IntentFilter(AstridApiConstants.BROADCAST_SEND_DETAILS)); getActivity().registerReceiver(detailReceiver, @@ -675,7 +672,6 @@ public class TaskListFragment extends ListFragment implements OnScrollListener, @Override public void onPause() { super.onPause(); - StatisticsService.sessionPause(); AndroidUtilities.tryUnregisterReceiver(getActivity(), detailReceiver); AndroidUtilities.tryUnregisterReceiver(getActivity(), refreshReceiver); diff --git a/astrid/src/com/todoroo/astrid/dao/TaskDao.java b/astrid/src/com/todoroo/astrid/dao/TaskDao.java index 37160551a..dd669272a 100644 --- a/astrid/src/com/todoroo/astrid/dao/TaskDao.java +++ b/astrid/src/com/todoroo/astrid/dao/TaskDao.java @@ -248,7 +248,10 @@ public class TaskDao extends DatabaseDao { long firstLaunchTime = Preferences.getLong(AstridPreferences.P_FIRST_LAUNCH, 0); long now = DateUtilities.now(); long timeSinceFirst = now - firstLaunchTime; - if (timeSinceFirst < DateUtilities.ONE_WEEK && !Preferences.getBoolean(StatisticsConstants.TASK_ONE_WEEK, false)) { + if (timeSinceFirst < DateUtilities.ONE_DAY * 3 && !Preferences.getBoolean(StatisticsConstants.TASK_THREE_DAYS, false)) { + StatisticsService.reportEvent(StatisticsConstants.TASK_THREE_DAYS); + Preferences.setBoolean(StatisticsConstants.TASK_THREE_DAYS, true); + } else if (timeSinceFirst < DateUtilities.ONE_WEEK && !Preferences.getBoolean(StatisticsConstants.TASK_ONE_WEEK, false)) { StatisticsService.reportEvent(StatisticsConstants.TASK_ONE_WEEK); Preferences.setBoolean(StatisticsConstants.TASK_ONE_WEEK, true); } else if (timeSinceFirst < 2 * DateUtilities.ONE_WEEK && !Preferences.getBoolean(StatisticsConstants.TASK_TWO_WEEKS, false)) { diff --git a/astrid/src/com/todoroo/astrid/service/StartupService.java b/astrid/src/com/todoroo/astrid/service/StartupService.java index af1df49c8..4dc4aa604 100644 --- a/astrid/src/com/todoroo/astrid/service/StartupService.java +++ b/astrid/src/com/todoroo/astrid/service/StartupService.java @@ -42,6 +42,7 @@ import com.todoroo.astrid.opencrx.OpencrxCoreUtils; import com.todoroo.astrid.producteev.ProducteevUtilities; import com.todoroo.astrid.reminders.ReminderStartupReceiver; import com.todoroo.astrid.service.abtesting.ABChooser; +import com.todoroo.astrid.service.abtesting.ABOptions; import com.todoroo.astrid.service.abtesting.FeatureFlipper; import com.todoroo.astrid.utility.AstridPreferences; import com.todoroo.astrid.utility.Constants; @@ -212,6 +213,7 @@ public class StartupService { } }).start(); + abChooser.getChoiceForOption(ABOptions.AB_OPTION_SWIPE_ENABLED_KEY); AstridPreferences.setPreferenceDefaults(); // check for task killers diff --git a/astrid/src/com/todoroo/astrid/service/StatisticsConstants.java b/astrid/src/com/todoroo/astrid/service/StatisticsConstants.java index 68ae0ed44..6fc22418b 100644 --- a/astrid/src/com/todoroo/astrid/service/StatisticsConstants.java +++ b/astrid/src/com/todoroo/astrid/service/StatisticsConstants.java @@ -64,9 +64,15 @@ public class StatisticsConstants { public static final String TASK_RABBIT_POST = "task-rabbit-post"; public static final String TASK_RABBIT_LOGIN = "task-rabbit-login"; + public static final String TASK_THREE_DAYS = "task-created-three-days"; public static final String TASK_ONE_WEEK = "task-created-one-week"; public static final String TASK_TWO_WEEKS = "task-created-two-weeks"; public static final String TASK_THREE_WEEKS = "task-created-three-weeks"; + public static final String APP_OPEN_THREE_DAYS = "app-open-three-days"; + public static final String APP_OPEN_ONE_WEEK = "app-open-one-week"; + public static final String APP_OPEN_TWO_WEEKS = "app-open-two-weeks"; + public static final String APP_OPEN_THREE_WEEKS = "app-open-three-weeks"; + } diff --git a/astrid/src/com/todoroo/astrid/service/UpgradeService.java b/astrid/src/com/todoroo/astrid/service/UpgradeService.java index 363ab8ef5..ecdf9ba20 100644 --- a/astrid/src/com/todoroo/astrid/service/UpgradeService.java +++ b/astrid/src/com/todoroo/astrid/service/UpgradeService.java @@ -201,7 +201,8 @@ public final class UpgradeService { if (from < V4_1_0) { newVersionString(changeLog, "4.1.0 (4/16/12)", new String[] { - "Swipe between lists! Swipe left and right to move through your lists", + "Swipe between lists! Swipe left and right to move through your lists. Enable or adjust " + + "performance of this feature in the 'Performance' section of Settings.", "Assign tasks to friends by choosing from your phone contacts", "Click on task titles in comments to edit those tasks", "Astrid.com sync improvements", diff --git a/astrid/src/com/todoroo/astrid/service/abtesting/ABOptions.java b/astrid/src/com/todoroo/astrid/service/abtesting/ABOptions.java index b59bad1ff..c322941ff 100644 --- a/astrid/src/com/todoroo/astrid/service/abtesting/ABOptions.java +++ b/astrid/src/com/todoroo/astrid/service/abtesting/ABOptions.java @@ -4,6 +4,8 @@ import java.util.ArrayList; import java.util.HashMap; import java.util.List; +import com.todoroo.astrid.service.StatisticsConstants; + /** * Helper class to define options with their probabilities and descriptions * @author Sam Bosley @@ -166,5 +168,15 @@ public class ABOptions { private void initialize() { // Set up //Calls to addOption go here + addOption(AB_OPTION_SWIPE_ENABLED_KEY, AB_OPTION_SWIPE_ENABLED_PROBS, AB_OPTION_SWIPE_ENABLED_DESC, AB_OPTION_SWIPE_ENABLED_EVENTS); } + + public static final String AB_OPTION_SWIPE_ENABLED_KEY = "swipeEnabled"; //$NON-NLS-1$ + private static final int[] AB_OPTION_SWIPE_ENABLED_PROBS = { 1, 1 }; + @SuppressWarnings("nls") + private static final String[] AB_OPTION_SWIPE_ENABLED_DESC = { "swipe-lists-enabled", "swipe-lists-disabled" }; + private static final String[] AB_OPTION_SWIPE_ENABLED_EVENTS = { StatisticsConstants.APP_OPEN_THREE_DAYS, + StatisticsConstants.APP_OPEN_ONE_WEEK, + StatisticsConstants.APP_OPEN_TWO_WEEKS, + StatisticsConstants.APP_OPEN_THREE_WEEKS }; } diff --git a/astrid/src/com/todoroo/astrid/utility/AstridPreferences.java b/astrid/src/com/todoroo/astrid/utility/AstridPreferences.java index 3236aacc3..1e9a4e786 100644 --- a/astrid/src/com/todoroo/astrid/utility/AstridPreferences.java +++ b/astrid/src/com/todoroo/astrid/utility/AstridPreferences.java @@ -11,6 +11,8 @@ import com.todoroo.andlib.utility.Preferences; import com.todoroo.astrid.api.AstridApiConstants; import com.todoroo.astrid.data.Task; import com.todoroo.astrid.service.ThemeService; +import com.todoroo.astrid.service.abtesting.ABChooser; +import com.todoroo.astrid.service.abtesting.ABOptions; public class AstridPreferences { @@ -46,7 +48,9 @@ public class AstridPreferences { Preferences.setIfUnset(prefs, editor, r, R.string.p_rmd_default_random_hours, 0); Preferences.setIfUnset(prefs, editor, r, R.string.p_fontSize, 18); Preferences.setIfUnset(prefs, editor, r, R.string.p_showNotes, false); - Preferences.setIfUnset(prefs, editor, r, R.string.p_swipe_lists_performance_key, 3); + + boolean swipeEnabled = (ABChooser.readChoiceForOption(ABOptions.AB_OPTION_SWIPE_ENABLED_KEY) == 0); + Preferences.setIfUnset(prefs, editor, r, R.string.p_swipe_lists_performance_key, swipeEnabled ? 3 : 0); if ("white-blue".equals(Preferences.getStringValue(R.string.p_theme))) { //$NON-NLS-1$ migrate from when white-blue wasn't the default Preferences.setString(R.string.p_theme, ThemeService.THEME_WHITE);