diff --git a/api/src/com/todoroo/andlib/utility/Preferences.java b/api/src/com/todoroo/andlib/utility/Preferences.java index e7e71159a..9e2bcef43 100644 --- a/api/src/com/todoroo/andlib/utility/Preferences.java +++ b/api/src/com/todoroo/andlib/utility/Preferences.java @@ -51,6 +51,20 @@ public class Preferences { editor.putBoolean(key, value); } + /** + * Helper to write to editor if key specified is null + * @param prefs + * @param editor + * @param r + * @param keyResource + * @param value + */ + public static void setIfUnset(SharedPreferences prefs, Editor editor, Resources r, int keyResource, String value) { + String key = r.getString(keyResource); + if(!prefs.contains(key) || !(prefs.getAll().get(key) instanceof Boolean)) + editor.putString(key, value); + } + /* ====================================================================== * ======================================================= helper methods * ====================================================================== */ diff --git a/astrid/plugin-src/com/todoroo/astrid/actfm/TagViewFragment.java b/astrid/plugin-src/com/todoroo/astrid/actfm/TagViewFragment.java index 7ac8576f6..0bd593e2d 100644 --- a/astrid/plugin-src/com/todoroo/astrid/actfm/TagViewFragment.java +++ b/astrid/plugin-src/com/todoroo/astrid/actfm/TagViewFragment.java @@ -17,6 +17,7 @@ import android.content.Intent; import android.content.IntentFilter; import android.os.Bundle; import android.support.v4.view.Menu; +import android.support.v4.view.MenuItem; import android.text.TextUtils; import android.util.DisplayMetrics; import android.view.MotionEvent; @@ -78,6 +79,7 @@ public class TagViewFragment extends TaskListFragment { public static final String EXTRA_TAG_DATA = "tagData"; //$NON-NLS-1$ protected static final int MENU_REFRESH_ID = MENU_SUPPORT_ID + 1; + protected static final int MENU_LIST_SETTINGS_ID = R.string.tag_settings_title; private static final int REQUEST_CODE_SETTINGS = 0; @@ -183,6 +185,16 @@ public class TagViewFragment extends TaskListFragment { } } + @Override + protected void addMenuItems(Menu menu, Activity activity) { + super.addMenuItems(menu, activity); + if (!Preferences.getBoolean(R.string.p_show_list_members, true)) { + MenuItem item = menu.add(Menu.NONE, MENU_LIST_SETTINGS_ID, 0, R.string.tag_settings_title); + item.setIcon(R.drawable.list_settings); + item.setShowAsAction(MenuItem.SHOW_AS_ACTION_ALWAYS); + } + } + // --- data loading @Override @@ -310,6 +322,10 @@ public class TagViewFragment extends TaskListFragment { } protected void setUpMembersGallery() { + if (!Preferences.getBoolean(R.string.p_show_list_members, true)) { + getView().findViewById(R.id.members_header).setVisibility(View.GONE); + return; + } if (tagData == null) return; LinearLayout membersView = (LinearLayout)getView().findViewById(R.id.shared_with); @@ -546,6 +562,9 @@ public class TagViewFragment extends TaskListFragment { case MENU_REFRESH_ID: refreshData(true); return true; + case MENU_LIST_SETTINGS_ID: + settingsListener.onClick(null); + return true; } return super.handleOptionsMenuItemSelected(id, intent); diff --git a/astrid/plugin-src/com/todoroo/astrid/core/CustomFilterExposer.java b/astrid/plugin-src/com/todoroo/astrid/core/CustomFilterExposer.java index a344df867..6514d8958 100644 --- a/astrid/plugin-src/com/todoroo/astrid/core/CustomFilterExposer.java +++ b/astrid/plugin-src/com/todoroo/astrid/core/CustomFilterExposer.java @@ -27,6 +27,7 @@ import com.todoroo.andlib.sql.Query; import com.todoroo.andlib.sql.QueryTemplate; import com.todoroo.andlib.utility.AndroidUtilities; import com.todoroo.andlib.utility.DialogUtilities; +import com.todoroo.andlib.utility.Preferences; import com.todoroo.astrid.actfm.sync.ActFmPreferenceService; import com.todoroo.astrid.activity.FilterListFragment; import com.todoroo.astrid.api.AstridApiConstants; @@ -100,11 +101,18 @@ public final class CustomFilterExposer extends BroadcastReceiver implements Astr private Filter[] buildSavedFilters(Context context, Resources r) { int themeFlags = ThemeService.getFilterThemeFlags(); + boolean useCustomFilters = Preferences.getBoolean(R.string.p_use_filters, true); StoreObjectDao dao = PluginServices.getStoreObjectDao(); - TodorooCursor cursor = dao.query(Query.select(StoreObject.PROPERTIES).where( + TodorooCursor cursor = null; + if (useCustomFilters) + cursor = dao.query(Query.select(StoreObject.PROPERTIES).where( StoreObject.TYPE.eq(SavedFilter.TYPE)).orderBy(Order.asc(SavedFilter.NAME))); try { - Filter[] list = new Filter[cursor.getCount() + 3]; + Filter[] list; + if (useCustomFilters && cursor != null) + list = new Filter[cursor.getCount() + 3]; + else + list = new Filter[3]; // stock filters list[0] = getTodayFilter(r); @@ -120,24 +128,27 @@ public final class CustomFilterExposer extends BroadcastReceiver implements Astr list[2] = getAssignedByMeFilter(r); - StoreObject savedFilter = new StoreObject(); - for(int i = 3; i < list.length; i++) { - cursor.moveToNext(); - savedFilter.readFromCursor(cursor); - list[i] = SavedFilter.load(savedFilter); - - Intent deleteIntent = new Intent(context, DeleteActivity.class); - deleteIntent.putExtra(TOKEN_FILTER_ID, savedFilter.getId()); - deleteIntent.putExtra(TOKEN_FILTER_NAME, list[i].title); - list[i].contextMenuLabels = new String[] { context.getString(R.string.BFE_Saved_delete) }; - list[i].contextMenuIntents = new Intent[] { deleteIntent }; - list[i].listingIcon = ((BitmapDrawable)r.getDrawable( - ThemeService.getDrawable(R.drawable.filter_sliders, themeFlags))).getBitmap(); + if (useCustomFilters && cursor != null) { + StoreObject savedFilter = new StoreObject(); + for(int i = 3; i < list.length; i++) { + cursor.moveToNext(); + savedFilter.readFromCursor(cursor); + list[i] = SavedFilter.load(savedFilter); + + Intent deleteIntent = new Intent(context, DeleteActivity.class); + deleteIntent.putExtra(TOKEN_FILTER_ID, savedFilter.getId()); + deleteIntent.putExtra(TOKEN_FILTER_NAME, list[i].title); + list[i].contextMenuLabels = new String[] { context.getString(R.string.BFE_Saved_delete) }; + list[i].contextMenuIntents = new Intent[] { deleteIntent }; + list[i].listingIcon = ((BitmapDrawable)r.getDrawable( + ThemeService.getDrawable(R.drawable.filter_sliders, themeFlags))).getBitmap(); + } } return list; } finally { - cursor.close(); + if (cursor != null) + cursor.close(); } } diff --git a/astrid/plugin-src/com/todoroo/astrid/gtasks/GtasksListFragment.java b/astrid/plugin-src/com/todoroo/astrid/gtasks/GtasksListFragment.java index 22b752ced..31009a398 100644 --- a/astrid/plugin-src/com/todoroo/astrid/gtasks/GtasksListFragment.java +++ b/astrid/plugin-src/com/todoroo/astrid/gtasks/GtasksListFragment.java @@ -10,7 +10,6 @@ import android.app.ProgressDialog; import android.content.Intent; import android.os.Bundle; import android.support.v4.view.Menu; -import android.view.MenuInflater; import android.widget.TextView; import com.timsu.astrid.R; @@ -110,8 +109,8 @@ public class GtasksListFragment extends SubtasksListFragment { } @Override - public void onCreateOptionsMenu(Menu menu, MenuInflater inflater) { - super.onCreateOptionsMenu(menu, inflater); + protected void addMenuItems(Menu menu, Activity activity) { + super.addMenuItems(menu, activity); addMenuItem(menu, R.string.gtasks_GTA_clear_completed, android.R.drawable.ic_input_delete, MENU_CLEAR_COMPLETED_ID, false); } diff --git a/astrid/plugin-src/com/todoroo/astrid/tags/reusable/FeaturedTaskListFragment.java b/astrid/plugin-src/com/todoroo/astrid/tags/reusable/FeaturedTaskListFragment.java index 661580002..a073710ef 100644 --- a/astrid/plugin-src/com/todoroo/astrid/tags/reusable/FeaturedTaskListFragment.java +++ b/astrid/plugin-src/com/todoroo/astrid/tags/reusable/FeaturedTaskListFragment.java @@ -9,7 +9,6 @@ import android.support.v4.view.MenuItem; import android.text.TextUtils; import android.view.ContextMenu; import android.view.ContextMenu.ContextMenuInfo; -import android.view.MenuInflater; import android.view.View; import android.widget.TextView; import android.widget.Toast; @@ -64,10 +63,8 @@ public class FeaturedTaskListFragment extends TagViewFragment { } @Override - public void onCreateOptionsMenu(Menu menu, MenuInflater inflater) { - super.onCreateOptionsMenu(menu, inflater); - if (!isCurrentTaskListFragment()) - return; + protected void addMenuItems(Menu menu, Activity activity) { + super.addMenuItems(menu, activity); MenuItem item = menu.add(Menu.NONE, MENU_CLONE_LIST, 0, R.string.actfm_feat_list_clone); item.setIcon(R.drawable.ic_menu_list_copy); item.setShowAsAction(MenuItem.SHOW_AS_ACTION_ALWAYS); diff --git a/astrid/res/layout/task_list_body_tag.xml b/astrid/res/layout/task_list_body_tag.xml index b53ed1a2d..039a2e86d 100644 --- a/astrid/res/layout/task_list_body_tag.xml +++ b/astrid/res/layout/task_list_body_tag.xml @@ -12,6 +12,7 @@ android:layout_weight="100"> diff --git a/astrid/res/values/keys.xml b/astrid/res/values/keys.xml index 5b7e873c8..fab97b62e 100644 --- a/astrid/res/values/keys.xml +++ b/astrid/res/values/keys.xml @@ -316,6 +316,12 @@ p_end_at_deadline + + p_use_filters + + + p_show_list_members + -1 diff --git a/astrid/res/values/strings-core.xml b/astrid/res/values/strings-core.xml index 3638592a0..03704b8e9 100644 --- a/astrid/res/values/strings-core.xml +++ b/astrid/res/values/strings-core.xml @@ -698,6 +698,14 @@ Truncate title to one line with date and lists below Truncate title to two lines with date on right + + Use filters + Lets you create custom filters + + + Show list members in shared lists + + Color theme diff --git a/astrid/res/xml/preferences.xml b/astrid/res/xml/preferences.xml index deef94323..c79bddb65 100644 --- a/astrid/res/xml/preferences.xml +++ b/astrid/res/xml/preferences.xml @@ -78,6 +78,12 @@ android:title="@string/EPr_ideaAuto_title" android:defaultValue="true" /> + + + + list = constructOrderedControlList(context); + String moreSeparator = context.getResources().getString(R.string.TEA_ctrl_more_pref); + String importancePref = context.getResources().getString(R.string.TEA_ctrl_importance_pref); + String listsPref = context.getResources().getString(R.string.TEA_ctrl_lists_pref); + + list.remove(importancePref); + list.remove(listsPref); + int moreIndex = list.indexOf(moreSeparator); + if (moreIndex >= 0) { + list.add(moreIndex + 1, listsPref); + list.add(moreIndex + 1, importancePref); + } + + StringBuilder newSetting = new StringBuilder(30); + for (String item : list) { + newSetting.append(item); + newSetting.append(BEAST_MODE_PREF_ITEM_SEPARATOR); + } + Preferences.setString(BEAST_MODE_ORDER_PREF, newSetting.toString()); + } + @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); diff --git a/astrid/src/com/todoroo/astrid/activity/TaskListActivity.java b/astrid/src/com/todoroo/astrid/activity/TaskListActivity.java index 1d94211cd..21abe7b4c 100644 --- a/astrid/src/com/todoroo/astrid/activity/TaskListActivity.java +++ b/astrid/src/com/todoroo/astrid/activity/TaskListActivity.java @@ -170,8 +170,8 @@ public class TaskListActivity extends AstridActivity implements MainMenuListener */ @Override protected void onCreate(Bundle savedInstanceState) { - ThemeService.applyTheme(this); super.onCreate(savedInstanceState); + ThemeService.applyTheme(this); DependencyInjectionService.getInstance().inject(this); int contentView = getContentView(); diff --git a/astrid/src/com/todoroo/astrid/activity/TaskListFragment.java b/astrid/src/com/todoroo/astrid/activity/TaskListFragment.java index ce178cc51..1f40e68ae 100644 --- a/astrid/src/com/todoroo/astrid/activity/TaskListFragment.java +++ b/astrid/src/com/todoroo/astrid/activity/TaskListFragment.java @@ -428,20 +428,23 @@ public class TaskListFragment extends ListFragment implements OnScrollListener, * @return true if menu should be displayed */ @Override - public void onCreateOptionsMenu(Menu menu, MenuInflater inflater) { + public final void onCreateOptionsMenu(Menu menu, MenuInflater inflater) { Activity activity = getActivity(); if (activity == null) return; if (!isCurrentTaskListFragment()) return; + addMenuItems(menu, activity); + } + + protected void addMenuItems(Menu menu, Activity activity) { boolean isTablet = AstridPreferences.useTabletLayout(activity); TaskListActivity tla = null; if (activity instanceof TaskListActivity) { tla = (TaskListActivity) activity; tla.getMainMenuPopover().clear(); } - // --- sync if (tla == null || tla.getTaskEditFragment() == null) addSyncRefreshMenuItem(menu, isTablet ? ThemeService.FLAG_INVERT : 0); @@ -453,8 +456,9 @@ public class TaskListFragment extends ListFragment implements OnScrollListener, } // --- new filter - addMenuItem(menu, R.string.FLA_new_filter, - ThemeService.getDrawable(R.drawable.icn_menu_filters, isTablet ? ThemeService.FLAG_FORCE_DARK: 0), MENU_NEW_FILTER_ID, false); + if (Preferences.getBoolean(R.string.p_use_filters, true)) + addMenuItem(menu, R.string.FLA_new_filter, + ThemeService.getDrawable(R.drawable.icn_menu_filters, isTablet ? ThemeService.FLAG_FORCE_DARK: 0), MENU_NEW_FILTER_ID, false); // --- addons if(Constants.MARKET_STRATEGY.showAddonMenu()) diff --git a/astrid/src/com/todoroo/astrid/service/abtesting/ABTests.java b/astrid/src/com/todoroo/astrid/service/abtesting/ABTests.java index ed98d0f57..efc2a72be 100644 --- a/astrid/src/com/todoroo/astrid/service/abtesting/ABTests.java +++ b/astrid/src/com/todoroo/astrid/service/abtesting/ABTests.java @@ -143,9 +143,11 @@ public class ABTests { * (i.e. the arrays should be the same length if this one exists) * */ - public void addTest(String testKey, int[] newUserProbs, int[] existingUserProbs, String[] descriptions) { - ABTestBundle bundle = new ABTestBundle(newUserProbs, existingUserProbs, descriptions); - bundles.put(testKey, bundle); + public void addTest(String testKey, int[] newUserProbs, int[] existingUserProbs, String[] descriptions, boolean appliesToAstridLite) { + if (appliesToAstridLite) { + ABTestBundle bundle = new ABTestBundle(newUserProbs, existingUserProbs, descriptions); + bundles.put(testKey, bundle); + } } public static final String AB_FEATURED_LISTS = "android_featured_lists"; //$NON-NLS-1$ @@ -163,15 +165,15 @@ public class ABTests { private void initialize() { addTest(AB_FEATURED_LISTS, new int[] { 1, 1 }, - new int[] { 1, 1 }, new String[] { "featured-lists-disabled", "featured-lists-enabled" }); //$NON-NLS-1$ //$NON-NLS-2$ + new int[] { 1, 1 }, new String[] { "featured-lists-disabled", "featured-lists-enabled" }, false); //$NON-NLS-1$ //$NON-NLS-2$ addTest(AB_SOCIAL_REMINDERS, new int[] { 1, 1 }, - new int[] { 1, 1 }, new String[] { "no-faces", "show-faces" }); //$NON-NLS-1$ //$NON-NLS-2$ + new int[] { 1, 1 }, new String[] { "no-faces", "show-faces" }, true); //$NON-NLS-1$ //$NON-NLS-2$ addTest(AB_DRAG_DROP, new int[] { 3, 1 }, - new int[] { 1, 0 }, new String[] { "off-by-default", "on-by-default" }); //$NON-NLS-1$ //$NON-NLS-2$ + new int[] { 1, 0 }, new String[] { "off-by-default", "on-by-default" }, false); //$NON-NLS-1$ //$NON-NLS-2$ addTest(AB_DEFAULT_EDIT_TAB, new int[] { 1, 1 }, - new int[] { 1, 1 }, new String[] { "activity-tab", "details-tab" }); //$NON-NLS-1$ //$NON-NLS-2$ + new int[] { 1, 1 }, new String[] { "activity-tab", "details-tab" }, true); //$NON-NLS-1$ //$NON-NLS-2$ } } diff --git a/astrid/src/com/todoroo/astrid/utility/AstridPreferences.java b/astrid/src/com/todoroo/astrid/utility/AstridPreferences.java index f31be0491..4bd62025b 100644 --- a/astrid/src/com/todoroo/astrid/utility/AstridPreferences.java +++ b/astrid/src/com/todoroo/astrid/utility/AstridPreferences.java @@ -17,6 +17,7 @@ import com.todoroo.andlib.sql.Functions; import com.todoroo.andlib.sql.Query; import com.todoroo.andlib.utility.AndroidUtilities; import com.todoroo.andlib.utility.Preferences; +import com.todoroo.astrid.activity.BeastModePreferences; import com.todoroo.astrid.api.AstridApiConstants; import com.todoroo.astrid.core.PluginServices; import com.todoroo.astrid.core.SortHelper; @@ -51,6 +52,13 @@ public class AstridPreferences { /** Set preference defaults, if unset. called at startup */ public static void setPreferenceDefaults() { + if (Constants.ASTRID_LITE) + setLitePreferenceDefaults(); + else + setNormalPreferenceDefaults(); + } + + private static void setNormalPreferenceDefaults() { Context context = ContextManager.getContext(); SharedPreferences prefs = Preferences.getPrefs(context); Editor editor = prefs.edit(); @@ -116,6 +124,70 @@ public class AstridPreferences { editor.commit(); } + private static void setLitePreferenceDefaults() { + Context context = ContextManager.getContext(); + SharedPreferences prefs = Preferences.getPrefs(context); + Editor editor = prefs.edit(); + Resources r = context.getResources(); + + Preferences.setIfUnset(prefs, editor, r, R.string.p_default_urgency_key, 4); + Preferences.setIfUnset(prefs, editor, r, R.string.p_default_importance_key, 2); + Preferences.setIfUnset(prefs, editor, r, R.string.p_default_hideUntil_key, 0); + + Preferences.setIfUnset(prefs, editor, r, R.string.p_default_reminders_key, Task.NOTIFY_AT_DEADLINE | Task.NOTIFY_AFTER_DEADLINE); + Preferences.setIfUnset(prefs, editor, r, R.string.p_default_reminders_mode_key, 16); + 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_use_contact_picker, false); + Preferences.setIfUnset(prefs, editor, r, R.string.p_field_missed_calls, true); + + Preferences.setIfUnset(prefs, editor, r, R.string.p_third_party_addons, false); + Preferences.setIfUnset(prefs, editor, r, R.string.p_end_at_deadline, true); + + Preferences.setIfUnset(prefs, editor, r, R.string.p_rmd_persistent, true); + + Preferences.setIfUnset(prefs, editor, r, R.string.p_ideas_tab_enabled, false); + Preferences.setIfUnset(prefs, editor, r, R.string.p_autoIdea, false); + + Preferences.setIfUnset(prefs, editor, r, R.string.p_show_featured_lists, false); + + Preferences.setIfUnset(prefs, editor, r, R.string.p_taskRowStyle, true); + + Preferences.setIfUnset(prefs, editor, r, R.string.p_calendar_reminders, true); + + Preferences.setIfUnset(prefs, editor, r, R.string.p_social_reminders, + ABChooser.readChoiceForTest(ABTests.AB_SOCIAL_REMINDERS) != 0); + + Preferences.setIfUnset(prefs, editor, r, R.string.p_use_filters, false); + + Preferences.setIfUnset(prefs, editor, r, R.string.p_show_list_members, false); + + SharedPreferences publicPrefs = getPublicPrefs(context); + if (publicPrefs != null) { + Editor edit = publicPrefs.edit(); + if (edit != null) { + edit.putInt(SortHelper.PREF_SORT_FLAGS, SortHelper.FLAG_DRAG_DROP); + edit.putInt(SortHelper.PREF_SORT_SORT, SortHelper.SORT_AUTO); + edit.commit(); + Preferences.setInt(P_SUBTASKS_HELP, 1); + } + } + + BeastModePreferences.setDefaultLiteModeOrder(context); + + Preferences.setIfUnset(prefs, editor, r, R.string.p_theme, ThemeService.THEME_WHITE_RED); + + Preferences.setIfUnset(prefs, editor, r, R.string.p_force_phone_layout, true); + + setShowFriendsView(); + + setShowFeaturedLists(); + + editor.commit(); + } + /** * Reset preferences based on archived AB tests * @param fromVersion diff --git a/astrid/src/com/todoroo/astrid/utility/Constants.java b/astrid/src/com/todoroo/astrid/utility/Constants.java index 13647ee28..de4414a77 100644 --- a/astrid/src/com/todoroo/astrid/utility/Constants.java +++ b/astrid/src/com/todoroo/astrid/utility/Constants.java @@ -43,6 +43,11 @@ public final class Constants { */ public static final boolean DEBUG = false; + /** + * Whether this version is Astrid Lite + */ + public static final boolean ASTRID_LITE = true; + /** * Astrid Help URL */ diff --git a/tests/src/com/todoroo/astrid/service/ABTestingServiceTest.java b/tests/src/com/todoroo/astrid/service/ABTestingServiceTest.java index 5923e33bf..dcd2651ce 100644 --- a/tests/src/com/todoroo/astrid/service/ABTestingServiceTest.java +++ b/tests/src/com/todoroo/astrid/service/ABTestingServiceTest.java @@ -91,7 +91,7 @@ public class ABTestingServiceTest extends DatabaseTestCase { @Override protected void setUp() throws Exception { super.setUp(); - abTests.addTest(TEST_NAME, new int[] { 9, 1 } , new int[] { 1, 9 }, TEST_OPTIONS); + abTests.addTest(TEST_NAME, new int[] { 9, 1 } , new int[] { 1, 9 }, TEST_OPTIONS, true); Preferences.clear(TEST_NAME); }