Default list preference changes

pull/384/head
Alex Baker 8 years ago
parent d48f11d70c
commit 871513ccee

@ -16,4 +16,8 @@ public class GtasksFilterExposer {
public List<Filter> getFilters() {
return Collections.emptyList();
}
public Filter getFilter(long aLong) {
return null;
}
}

@ -3,4 +3,5 @@ package com.todoroo.astrid.gtasks;
import com.todoroo.astrid.activity.TaskListFragment;
public class GtasksListFragment extends TaskListFragment {
public static final String TOKEN_STORE_ID = "storeId";
}

@ -42,6 +42,8 @@ import static java.util.Collections.emptyList;
*/
public class GtasksFilterExposer {
private static final int CLOUD = R.drawable.ic_cloud_queue_24dp;
private final GtasksListService gtasksListService;
private final GtasksPreferenceService gtasksPreferenceService;
private final Context context;
@ -62,18 +64,24 @@ public class GtasksFilterExposer {
return emptyList();
}
int cloud = R.drawable.ic_cloud_queue_24dp;
List<Filter> listFilters = newArrayList();
for (GtasksList list : gtasksListService.getLists()) {
Filter filter = filterFromList(gtasksMetadata, context, list);
filter.icon = cloud;
listFilters.add(filter);
listFilters.add(filterFromList(list));
}
return listFilters;
}
public static Filter filterFromList(GtasksMetadata gtasksMetadata, Context context, GtasksList list) {
public Filter getFilter(long id) {
if (gtasksPreferenceService.isLoggedIn()) {
GtasksList list = gtasksListService.getList(id);
if (list != null) {
return filterFromList(list);
}
}
return null;
}
private Filter filterFromList(GtasksList list) {
String listName = list.getName();
ContentValues values = new ContentValues();
values.putAll(gtasksMetadata.createEmptyMetadata(AbstractModel.NO_ID).getMergedValues());
@ -92,7 +100,7 @@ public class GtasksFilterExposer {
Bundle extras = new Bundle();
extras.putLong(GtasksListFragment.TOKEN_STORE_ID, list.getId());
filter.customExtras = extras;
filter.icon = CLOUD;
return filter;
}
}

@ -33,6 +33,10 @@ public class GtasksListService {
return storeObjectDao.getGtasksLists();
}
public GtasksList getList(long id) {
return storeObjectDao.getGtasksList(id);
}
/**
* Reads in remote list information and updates local list objects.
*

@ -92,7 +92,7 @@ public final class BuiltInFilterExposer {
null);
}
private static Filter getTodayFilter(Resources r) {
public static Filter getTodayFilter(Resources r) {
String todayTitle = AndroidUtilities.capitalize(r.getString(R.string.today));
ContentValues todayValues = new ContentValues();
todayValues.put(Task.DUE_DATE.name, PermaSql.VALUE_NOON);
@ -104,7 +104,7 @@ public final class BuiltInFilterExposer {
todayValues);
}
private static Filter getRecentlyModifiedFilter(Resources r) {
public static Filter getRecentlyModifiedFilter(Resources r) {
return new Filter(r.getString(R.string.BFE_Recent),
new QueryTemplate().where(
TaskCriteria.notDeleted()).orderBy(
@ -112,7 +112,7 @@ public final class BuiltInFilterExposer {
null);
}
private static Filter getUncategorizedFilter(Resources r) {
public static Filter getUncategorizedFilter(Resources r) {
return new Filter(r.getString(R.string.tag_FEx_untagged),
new QueryTemplate().where(Criterion.and(
Criterion.not(Task.UUID.in(Query.select(TaskToTagMetadata.TASK_UUID).from(Metadata.TABLE)
@ -122,14 +122,19 @@ public final class BuiltInFilterExposer {
null);
}
/**
* Is this the inbox?
*/
public static boolean isInbox(Context context, Filter filter) {
return (filter != null && filter.equals(getMyTasksFilter(context.getResources())));
return filter != null && filter.equals(getMyTasksFilter(context.getResources()));
}
public static boolean isTodayFilter(Context context, Filter filter) {
return (filter != null && filter.equals(getTodayFilter(context.getResources())));
return filter != null && filter.equals(getTodayFilter(context.getResources()));
}
public static boolean isUncategorizedFilter(Context context, Filter filter) {
return filter != null && filter.equals(getUncategorizedFilter(context.getResources()));
}
public static boolean isRecentlyModifiedFilter(Context context, Filter filter) {
return filter != null && filter.equals(getRecentlyModifiedFilter(context.getResources()));
}
}

@ -5,7 +5,11 @@
*/
package com.todoroo.astrid.core;
import com.todoroo.andlib.data.Callback;
import android.content.ContentValues;
import android.text.TextUtils;
import com.google.common.base.Function;
import com.todoroo.andlib.utility.AndroidUtilities;
import com.todoroo.astrid.api.CustomFilter;
import com.todoroo.astrid.api.Filter;
import com.todoroo.astrid.dao.StoreObjectDao;
@ -13,13 +17,17 @@ import com.todoroo.astrid.data.StoreObject;
import org.tasks.R;
import java.util.ArrayList;
import java.util.List;
import javax.inject.Inject;
import static com.google.common.collect.Lists.newArrayList;
import static com.google.common.collect.Lists.transform;
public final class CustomFilterExposer {
private static final int filter = R.drawable.ic_filter_list_24dp;
private final StoreObjectDao storeObjectDao;
@Inject
@ -28,19 +36,32 @@ public final class CustomFilterExposer {
}
public List<Filter> getFilters() {
final List<Filter> list = new ArrayList<>();
final int filter = R.drawable.ic_filter_list_24dp;
storeObjectDao.getSavedFilters(new Callback<StoreObject>() {
return newArrayList(transform(storeObjectDao.getSavedFilters(), new Function<StoreObject, Filter>() {
@Override
public void apply(StoreObject savedFilter) {
CustomFilter f = SavedFilter.load(savedFilter);
f.icon = filter;
list.add(f);
public Filter apply(StoreObject input) {
return load(input);
}
});
}));
}
public Filter getFilter(long id) {
return load(storeObjectDao.getSavedFilterById(id));
}
private Filter load(StoreObject savedFilter) {
String title = savedFilter.getValue(SavedFilter.NAME);
String sql = savedFilter.getValue(SavedFilter.SQL);
String values = savedFilter.getValue(SavedFilter.VALUES);
ContentValues contentValues = null;
if(!TextUtils.isEmpty(values)) {
contentValues = AndroidUtilities.contentValuesFromSerializedString(values);
}
sql = sql.replace("tasks.userId=0", "1"); // TODO: replace dirty hack for missing column
return list;
CustomFilter customFilter = new CustomFilter(title, sql, contentValues, savedFilter.getId());
customFilter.icon = filter;
return customFilter;
}
}

@ -6,11 +6,9 @@
package com.todoroo.astrid.core;
import android.content.ContentValues;
import android.text.TextUtils;
import com.todoroo.andlib.data.Property.StringProperty;
import com.todoroo.andlib.utility.AndroidUtilities;
import com.todoroo.astrid.api.CustomFilter;
import com.todoroo.astrid.core.CustomFilterActivity.CriterionInstance;
import com.todoroo.astrid.dao.StoreObjectDao;
import com.todoroo.astrid.data.StoreObject;
@ -110,23 +108,4 @@ public class SavedFilter {
return item.replace(AndroidUtilities.SERIALIZATION_SEPARATOR,
AndroidUtilities.SEPARATOR_ESCAPE);
}
/**
* Read filter from store
*/
public static CustomFilter load(StoreObject savedFilter) {
String title = savedFilter.getValue(NAME);
String sql = savedFilter.getValue(SQL);
String values = savedFilter.getValue(VALUES);
ContentValues contentValues = null;
if(!TextUtils.isEmpty(values)) {
contentValues = AndroidUtilities.contentValuesFromSerializedString(values);
}
sql = sql.replace("tasks.userId=0", "1"); // TODO: replace dirty hack for missing column
return new CustomFilter(title, sql, contentValues, savedFilter.getId());
}
}

@ -6,7 +6,6 @@
package com.todoroo.astrid.dao;
import com.google.common.base.Function;
import com.todoroo.andlib.data.Callback;
import com.todoroo.andlib.data.DatabaseDao;
import com.todoroo.andlib.sql.Criterion;
import com.todoroo.andlib.sql.Order;
@ -34,12 +33,17 @@ public class StoreObjectDao {
dao = new DatabaseDao<>(database, StoreObject.class);
}
public void getSavedFilters(Callback<StoreObject> callback) {
dao.query(callback, select(StoreObject.PROPERTIES)
public List<StoreObject> getSavedFilters() {
return dao.toList(select(StoreObject.PROPERTIES)
.where(isSavedFilter)
.orderBy(Order.asc(SavedFilter.NAME)));
}
public StoreObject getSavedFilterById(long id) {
return dao.getFirst(select(StoreObject.PROPERTIES)
.where(and(isSavedFilter, StoreObject.ID.eq(id))));
}
public GtasksList getGtasksList(long id) {
StoreObject result = dao.fetch(id, StoreObject.PROPERTIES);
if (!result.getType().equals(GtasksList.TYPE)) {

@ -57,6 +57,10 @@ public class TagFilterExposer {
return list;
}
public Filter getFilterByUuid(String uuid) {
return filterFromTagData(context, tagService.tagFromUUID(uuid));
}
/** Create filter from new tag object */
public static FilterWithCustomIntent filterFromTag(Context context, TagData tag, Criterion criterion) {
String title = tag.getName();
@ -101,7 +105,7 @@ public class TagFilterExposer {
return filters;
}
protected Filter constructFilter(Context context, TagData tag) {
private Filter constructFilter(Context context, TagData tag) {
return filterFromTag(context, tag, TaskCriteria.activeAndVisible());
}

@ -78,7 +78,7 @@ public final class TagService {
return array.toArray(new TagData[array.size()]);
}
private TagData tagFromUUID(String uuid) {
public TagData tagFromUUID(String uuid) {
return tagDataDao.getByUuid(uuid, TagData.PROPERTIES);
}

@ -5,7 +5,7 @@ import org.tasks.R;
public class Tracking {
public enum Events {
SET_DEFAULT_LIST(R.string.tracking_category_preferences, R.string.tracking_action_set, R.string.p_default_list_name);
SET_DEFAULT_LIST(R.string.tracking_category_preferences, R.string.tracking_action_set, R.string.p_default_list);
public final int category;
public final int action;

@ -50,7 +50,7 @@ public class AppearancePreferences extends InjectingPreferenceActivity {
return true;
}
});
Preference defaultList = findPreference(getString(R.string.p_default_list_name));
Preference defaultList = findPreference(getString(R.string.p_default_list));
Filter filter = defaultFilterProvider.getDefaultFilter();
defaultList.setSummary(filter.listingTitle);
defaultList.setOnPreferenceClickListener(new Preference.OnPreferenceClickListener() {
@ -87,7 +87,7 @@ public class AppearancePreferences extends InjectingPreferenceActivity {
if (resultCode == RESULT_OK) {
Filter filter = data.getParcelableExtra(FilterSelectionActivity.EXTRA_FILTER);
defaultFilterProvider.setDefaultFilter(filter);
findPreference(getString(R.string.p_default_list_name)).setSummary(filter.listingTitle);
findPreference(getString(R.string.p_default_list)).setSummary(filter.listingTitle);
}
} else {
super.onActivityResult(requestCode, resultCode, data);

@ -1,14 +1,17 @@
package org.tasks.preferences;
import android.content.ComponentName;
import android.content.ContentValues;
import android.content.Context;
import android.content.res.Resources;
import com.todoroo.andlib.utility.AndroidUtilities;
import com.todoroo.astrid.actfm.TagViewFragment;
import com.todoroo.astrid.api.CustomFilter;
import com.todoroo.astrid.api.Filter;
import com.todoroo.astrid.api.FilterWithCustomIntent;
import com.todoroo.astrid.core.BuiltInFilterExposer;
import com.todoroo.astrid.core.CustomFilterExposer;
import com.todoroo.astrid.gtasks.GtasksFilterExposer;
import com.todoroo.astrid.gtasks.GtasksListFragment;
import com.todoroo.astrid.tags.TagFilterExposer;
import org.tasks.R;
import org.tasks.analytics.Tracker;
@ -20,40 +23,53 @@ import javax.inject.Inject;
import timber.log.Timber;
import static com.google.common.base.Strings.isNullOrEmpty;
import static com.todoroo.astrid.core.BuiltInFilterExposer.getMyTasksFilter;
import static com.todoroo.astrid.core.BuiltInFilterExposer.getRecentlyModifiedFilter;
import static com.todoroo.astrid.core.BuiltInFilterExposer.getTodayFilter;
import static com.todoroo.astrid.core.BuiltInFilterExposer.getUncategorizedFilter;
import static com.todoroo.astrid.core.BuiltInFilterExposer.isRecentlyModifiedFilter;
import static com.todoroo.astrid.core.BuiltInFilterExposer.isTodayFilter;
import static com.todoroo.astrid.core.BuiltInFilterExposer.isUncategorizedFilter;
public class DefaultFilterProvider {
private static final int TYPE_FILTER = 0;
private static final int TYPE_CUSTOM_FILTER = 1;
private static final int TYPE_FILTER_WITH_CUSTOM_INTENT = 2;
private static final int TYPE_TAG = 2;
private static final int TYPE_GOOGLE_TASKS = 3;
private static final int FILTER_MY_TASKS = 0;
private static final int FILTER_TODAY = 1;
private static final int FILTER_UNCATEGORIZED = 2;
private static final int FILTER_RECENTLY_MODIFIED = 3;
private final Context context;
private final Preferences preferences;
private Tracker tracker;
private final Tracker tracker;
private final CustomFilterExposer customFilterExposer;
private final TagFilterExposer tagFilterExposer;
private final GtasksFilterExposer gtasksFilterExposer;
@Inject
public DefaultFilterProvider(@ForApplication Context context, Preferences preferences, Tracker tracker) {
public DefaultFilterProvider(@ForApplication Context context, Preferences preferences,
Tracker tracker, CustomFilterExposer customFilterExposer,
TagFilterExposer tagFilterExposer, GtasksFilterExposer gtasksFilterExposer) {
this.context = context;
this.preferences = preferences;
this.tracker = tracker;
this.customFilterExposer = customFilterExposer;
this.tagFilterExposer = tagFilterExposer;
this.gtasksFilterExposer = gtasksFilterExposer;
}
public Filter getDefaultFilter() {
String listName = preferences.getStringValue(R.string.p_default_list_name);
if (!isNullOrEmpty(listName)) {
String defaultList = preferences.getStringValue(R.string.p_default_list);
if (!isNullOrEmpty(defaultList)) {
try {
ContentValues valuesForNewTasks = AndroidUtilities.contentValuesFromSerializedString(preferences.getStringValue(R.string.p_default_list_values));
String sqlQuery = preferences.getStringValue(R.string.p_default_list_sql);
switch (preferences.getInt(R.string.p_default_list_type)) {
case TYPE_FILTER_WITH_CUSTOM_INTENT:
FilterWithCustomIntent filterWithCustomIntent = new FilterWithCustomIntent(listName, sqlQuery, valuesForNewTasks);
filterWithCustomIntent.customExtras = AndroidUtilities.bundleFromSerializedString(preferences.getStringValue(R.string.p_default_list_extras));
filterWithCustomIntent.customTaskList = ComponentName.unflattenFromString(preferences.getStringValue(R.string.p_default_list_class));
return filterWithCustomIntent;
case TYPE_CUSTOM_FILTER:
return new CustomFilter(listName, sqlQuery, valuesForNewTasks, preferences.getLong(R.string.p_default_list_id, 0L));
Filter filter = loadFilterFromPreferences(defaultList);
if (filter != null) {
return filter;
}
return new Filter(listName, sqlQuery, valuesForNewTasks);
} catch (Exception e) {
Timber.e(e, e.getMessage());
}
@ -61,28 +77,78 @@ public class DefaultFilterProvider {
return BuiltInFilterExposer.getMyTasksFilter(context.getResources());
}
private Filter loadFilterFromPreferences(String defaultList) {
String[] split = defaultList.split(":");
switch (Integer.parseInt(split[0])) {
case TYPE_FILTER:
return getBuiltInFilter(Integer.parseInt(split[1]));
case TYPE_CUSTOM_FILTER:
return customFilterExposer.getFilter(Long.parseLong(split[1]));
case TYPE_TAG:
return tagFilterExposer.getFilterByUuid(split[1]);
case TYPE_GOOGLE_TASKS:
return gtasksFilterExposer.getFilter(Long.parseLong(split[1]));
default:
return null;
}
}
public void setDefaultFilter(Filter filter) {
tracker.reportEvent(Tracking.Events.SET_DEFAULT_LIST);
preferences.setString(R.string.p_default_list_name, filter.listingTitle);
preferences.setString(R.string.p_default_list_sql, filter.getSqlQuery());
preferences.setInt(R.string.p_default_list_type, getFilterType(filter));
preferences.setString(R.string.p_default_list_values, filter.valuesForNewTasks != null
? AndroidUtilities.contentValuesToSerializedString(filter.valuesForNewTasks)
: null);
if (filter instanceof FilterWithCustomIntent) {
preferences.setString(R.string.p_default_list_class, ((FilterWithCustomIntent) filter).customTaskList.flattenToString());
preferences.setString(R.string.p_default_list_extras, AndroidUtilities.bundleToSerializedString(((FilterWithCustomIntent) filter).customExtras));
} else if (filter instanceof CustomFilter) {
preferences.setLong(R.string.p_default_list_id, ((CustomFilter) filter).getId());
int filterType = getFilterType(filter);
switch (filterType) {
case TYPE_FILTER:
setDefaultFilter(filterType, getBuiltInFilterId(filter));
break;
case TYPE_CUSTOM_FILTER:
setDefaultFilter(filterType, ((CustomFilter) filter).getId());
break;
case TYPE_TAG:
setDefaultFilter(filterType, ((FilterWithCustomIntent) filter).customExtras.getString(TagViewFragment.EXTRA_TAG_UUID));
break;
case TYPE_GOOGLE_TASKS:
setDefaultFilter(filterType, ((FilterWithCustomIntent) filter).customExtras.getLong(GtasksListFragment.TOKEN_STORE_ID, 0L));
break;
}
}
private <T> void setDefaultFilter(int type, T value) {
preferences.setString(R.string.p_default_list, String.format("%s:%s", type, value));
}
private int getFilterType(Filter filter) {
if (filter instanceof FilterWithCustomIntent) {
return TYPE_FILTER_WITH_CUSTOM_INTENT;
return filter.isTagFilter()
? TYPE_TAG
: TYPE_GOOGLE_TASKS;
} else if (filter instanceof CustomFilter) {
return TYPE_CUSTOM_FILTER;
}
return TYPE_FILTER;
}
private Filter getBuiltInFilter(int id) {
Resources resources = context.getResources();
switch (id) {
case FILTER_TODAY:
return getTodayFilter(resources);
case FILTER_UNCATEGORIZED:
return getUncategorizedFilter(resources);
case FILTER_RECENTLY_MODIFIED:
return getRecentlyModifiedFilter(resources);
}
return getMyTasksFilter(resources);
}
private int getBuiltInFilterId(Filter filter) {
if (isTodayFilter(context, filter)) {
return FILTER_TODAY;
} else if (isUncategorizedFilter(context, filter)) {
return FILTER_UNCATEGORIZED;
} else if (isRecentlyModifiedFilter(context, filter)) {
return FILTER_RECENTLY_MODIFIED;
}
return FILTER_MY_TASKS;
}
}

@ -280,13 +280,7 @@
<string name="p_collect_statistics">collect_statistics</string>
<string name="p_back_button_saves_task">back_button_saves_task</string>
<string name="p_default_list_name">default_list_name</string>
<string name="p_default_list_sql">default_list_sql</string>
<string name="p_default_list_values">default_list_values</string>
<string name="p_default_list_type">default_list_type</string>
<string name="p_default_list_id">default_list_id</string>
<string name="p_default_list_class">default_list_class</string>
<string name="p_default_list_extras">default_list_extras</string>
<string name="p_default_list">default_list</string>
<string name="tracking_category_preferences">Preferences</string>
<string name="tracking_action_set">Set</string>

@ -10,7 +10,7 @@
<PreferenceCategory android:title="@string/task_list_options">
<com.todoroo.astrid.ui.MultilinePreference
android:key="@string/p_default_list_name"
android:key="@string/p_default_list"
android:title="@string/default_list" />
<com.todoroo.astrid.ui.MultilineListPreference

Loading…
Cancel
Save