Replace filter & criterion ContentValues with maps

pull/618/head
Alex Baker 8 years ago
parent 7223c9dd33
commit b8e4474e64

@ -21,6 +21,8 @@ import java.io.FileOutputStream;
import java.io.IOException; import java.io.IOException;
import java.io.InputStream; import java.io.InputStream;
import java.io.OutputStream; import java.io.OutputStream;
import java.util.HashMap;
import java.util.Map;
import java.util.Map.Entry; import java.util.Map.Entry;
import timber.log.Timber; import timber.log.Timber;
@ -80,9 +82,9 @@ public class AndroidUtilities {
/** /**
* Serializes a content value into a string * Serializes a content value into a string
*/ */
public static String contentValuesToSerializedString(ContentValues source) { public static String mapToSerializedString(Map<String, Object> source) {
StringBuilder result = new StringBuilder(); StringBuilder result = new StringBuilder();
for(Entry<String, Object> entry : source.valueSet()) { for(Entry<String, Object> entry : source.entrySet()) {
addSerialized(result, entry.getKey(), entry.getValue()); addSerialized(result, entry.getKey(), entry.getValue());
} }
return result.toString(); return result.toString();
@ -109,37 +111,42 @@ public class AndroidUtilities {
result.append(SERIALIZATION_SEPARATOR); result.append(SERIALIZATION_SEPARATOR);
} }
/** public static Map<String, Object> mapFromSerializedString(String string) {
* Turn ContentValues into a string if (string == null) {
*/ return new HashMap<>();
public static ContentValues contentValuesFromSerializedString(String string) {
if(string == null) {
return new ContentValues();
} }
ContentValues result = new ContentValues(); Map<String, Object> result = new HashMap<>();
fromSerialized(string, result, (object, key, type, value) -> { fromSerialized(string, result, (object, key, type, value) -> {
switch(type) { switch (type) {
case 'i': case 'i':
object.put(key, Integer.parseInt(value)); object.put(key, Integer.parseInt(value));
break; break;
case 'd': case 'd':
object.put(key, Double.parseDouble(value)); object.put(key, Double.parseDouble(value));
break; break;
case 'l': case 'l':
object.put(key, Long.parseLong(value)); object.put(key, Long.parseLong(value));
break; break;
case 's': case 's':
object.put(key, value.replace(SEPARATOR_ESCAPE, SERIALIZATION_SEPARATOR)); object.put(key, value.replace(SEPARATOR_ESCAPE, SERIALIZATION_SEPARATOR));
break; break;
case 'b': case 'b':
object.put(key, Boolean.parseBoolean(value)); object.put(key, Boolean.parseBoolean(value));
break; break;
} }
}); });
return result; return result;
} }
public static Map<String, Object> mapFromContentValues(ContentValues contentValues) {
Map<String, Object> map = new HashMap<>();
for (Map.Entry<String, Object> entry : contentValues.valueSet()) {
map.put(entry.getKey(), entry.getValue());
}
return map;
}
public interface SerializedPut<T> { public interface SerializedPut<T> {
void put(T object, String key, char type, String value) throws NumberFormatException; void put(T object, String key, char type, String value) throws NumberFormatException;
} }

@ -6,7 +6,6 @@
package com.todoroo.astrid.activity; package com.todoroo.astrid.activity;
import android.annotation.SuppressLint; import android.annotation.SuppressLint;
import android.content.ContentValues;
import android.content.Intent; import android.content.Intent;
import android.content.res.Configuration; import android.content.res.Configuration;
import android.os.Bundle; import android.os.Bundle;
@ -63,6 +62,8 @@ import org.tasks.ui.EmptyTaskEditFragment;
import org.tasks.ui.NavigationDrawerFragment; import org.tasks.ui.NavigationDrawerFragment;
import org.tasks.ui.PriorityControlSet; import org.tasks.ui.PriorityControlSet;
import java.util.Map;
import javax.inject.Inject; import javax.inject.Inject;
import butterknife.BindView; import butterknife.BindView;
@ -424,11 +425,11 @@ public class TaskListActivity extends InjectingAppCompatActivity implements
if (model == null) { if (model == null) {
Intent intent = getIntent(); Intent intent = getIntent();
String valuesAsString = intent.getStringExtra(TaskEditFragment.TOKEN_VALUES); String valuesAsString = intent.getStringExtra(TaskEditFragment.TOKEN_VALUES);
ContentValues values = null; Map<String, Object> values = null;
try { try {
if (valuesAsString != null) { if (valuesAsString != null) {
valuesAsString = PermaSql.replacePlaceholders(valuesAsString); valuesAsString = PermaSql.replacePlaceholders(valuesAsString);
values = AndroidUtilities.contentValuesFromSerializedString(valuesAsString); values = AndroidUtilities.mapFromSerializedString(valuesAsString);
} }
} catch (Exception e) { } catch (Exception e) {
// oops, can't serialize // oops, can't serialize

@ -1,12 +1,13 @@
package com.todoroo.astrid.api; package com.todoroo.astrid.api;
import android.content.ContentValues;
import android.os.Parcel; import android.os.Parcel;
import android.os.Parcelable; import android.os.Parcelable;
import com.todoroo.andlib.utility.AndroidUtilities; import com.todoroo.andlib.utility.AndroidUtilities;
import com.todoroo.astrid.data.StoreObject; import com.todoroo.astrid.data.StoreObject;
import java.util.Map;
public class CustomFilter extends Filter { public class CustomFilter extends Filter {
private long id; private long id;
@ -14,8 +15,8 @@ public class CustomFilter extends Filter {
} }
public CustomFilter(String listingTitle, String sql, ContentValues contentValues, long id) { public CustomFilter(String listingTitle, String sql, Map<String, Object> values, long id) {
super(listingTitle, sql, contentValues); super(listingTitle, sql, values);
this.id = id; this.id = id;
} }
@ -25,7 +26,7 @@ public class CustomFilter extends Filter {
storeObject.setItem(listingTitle); storeObject.setItem(listingTitle);
storeObject.setValue(sqlQuery); storeObject.setValue(sqlQuery);
if (valuesForNewTasks != null && valuesForNewTasks.size() > 0) { if (valuesForNewTasks != null && valuesForNewTasks.size() > 0) {
storeObject.setValue2(AndroidUtilities.contentValuesToSerializedString(valuesForNewTasks)); storeObject.setValue2(AndroidUtilities.mapToSerializedString(valuesForNewTasks));
} }
return storeObject; return storeObject;
} }

@ -5,11 +5,13 @@
*/ */
package com.todoroo.astrid.api; package com.todoroo.astrid.api;
import android.content.ContentValues;
import android.graphics.Bitmap; import android.graphics.Bitmap;
import android.os.Parcel; import android.os.Parcel;
import android.os.Parcelable; import android.os.Parcelable;
import java.util.HashMap;
import java.util.Map;
/** /**
* CustomFilterCriteria allow users to build a custom filter by chaining * CustomFilterCriteria allow users to build a custom filter by chaining
* together criteria * together criteria
@ -53,7 +55,7 @@ abstract public class CustomFilterCriterion implements Parcelable {
* tasks they create should also be tagged 'ABC'. If set to null, no * tasks they create should also be tagged 'ABC'. If set to null, no
* additional values will be stored for a task. * additional values will be stored for a task.
*/ */
public ContentValues valuesForNewTasks = null; public final Map<String, Object> valuesForNewTasks = new HashMap<>();
/** /**
* Icon for this criteria. Can be null for no bitmap * Icon for this criteria. Can be null for no bitmap
@ -74,7 +76,7 @@ abstract public class CustomFilterCriterion implements Parcelable {
dest.writeString(identifier); dest.writeString(identifier);
dest.writeString(text); dest.writeString(text);
dest.writeString(sql); dest.writeString(sql);
dest.writeParcelable(valuesForNewTasks, 0); dest.writeMap(valuesForNewTasks);
dest.writeParcelable(icon, 0); dest.writeParcelable(icon, 0);
dest.writeString(name); dest.writeString(name);
} }
@ -86,7 +88,7 @@ abstract public class CustomFilterCriterion implements Parcelable {
identifier = source.readString(); identifier = source.readString();
text = source.readString(); text = source.readString();
sql = source.readString(); sql = source.readString();
valuesForNewTasks = source.readParcelable(ContentValues.class.getClassLoader()); source.readMap(valuesForNewTasks, getClass().getClassLoader());
icon = source.readParcelable(Bitmap.class.getClassLoader()); icon = source.readParcelable(Bitmap.class.getClassLoader());
name = source.readString(); name = source.readString();
} }

@ -5,12 +5,15 @@
*/ */
package com.todoroo.astrid.api; package com.todoroo.astrid.api;
import android.content.ContentValues;
import android.os.Parcel; import android.os.Parcel;
import android.os.Parcelable; import android.os.Parcelable;
import com.todoroo.andlib.sql.QueryTemplate; import com.todoroo.andlib.sql.QueryTemplate;
import java.util.Collections;
import java.util.HashMap;
import java.util.Map;
/** /**
* A <code>FilterListFilter</code> allows users to display tasks that have * A <code>FilterListFilter</code> allows users to display tasks that have
* something in common. * something in common.
@ -24,14 +27,6 @@ import com.todoroo.andlib.sql.QueryTemplate;
*/ */
public class Filter extends FilterListItem { public class Filter extends FilterListItem {
// --- constants
/** Constant for valuesForNewTasks to indicate the value should be replaced
* with the current time as long */
public static final long VALUE_NOW = Long.MIN_VALUE + 1;
// --- instance variables
/** /**
* {@link PermaSql} query for this filter. The query will be appended to the select * {@link PermaSql} query for this filter. The query will be appended to the select
* statement after "<code>SELECT fields FROM table %s</code>". It is * statement after "<code>SELECT fields FROM table %s</code>". It is
@ -61,10 +56,10 @@ public class Filter extends FilterListItem {
* tasks they create should also be tagged 'ABC'. If set to null, no * tasks they create should also be tagged 'ABC'. If set to null, no
* additional values will be stored for a task. Can use {@link PermaSql} * additional values will be stored for a task. Can use {@link PermaSql}
*/ */
public ContentValues valuesForNewTasks = null; final public Map<String, Object> valuesForNewTasks = new HashMap<>();
public Filter(String listingTitle, QueryTemplate sqlQuery) { public Filter(String listingTitle, QueryTemplate sqlQuery) {
this(listingTitle, sqlQuery, null); this(listingTitle, sqlQuery, Collections.emptyMap());
} }
/** /**
@ -74,7 +69,7 @@ public class Filter extends FilterListItem {
* @param sqlQuery * @param sqlQuery
* SQL query for this list (see {@link #sqlQuery} for examples). * SQL query for this list (see {@link #sqlQuery} for examples).
*/ */
public Filter(String listingTitle, QueryTemplate sqlQuery, ContentValues valuesForNewTasks) { public Filter(String listingTitle, QueryTemplate sqlQuery, Map<String, Object> valuesForNewTasks) {
this(listingTitle, sqlQuery == null ? null : sqlQuery.toString(), this(listingTitle, sqlQuery == null ? null : sqlQuery.toString(),
valuesForNewTasks); valuesForNewTasks);
} }
@ -86,11 +81,11 @@ public class Filter extends FilterListItem {
* @param sqlQuery * @param sqlQuery
* SQL query for this list (see {@link #sqlQuery} for examples). * SQL query for this list (see {@link #sqlQuery} for examples).
*/ */
public Filter(String listingTitle, String sqlQuery, ContentValues valuesForNewTasks) { protected Filter(String listingTitle, String sqlQuery, Map<String, Object> valuesForNewTasks) {
this.listingTitle = listingTitle; this.listingTitle = listingTitle;
this.sqlQuery = sqlQuery; this.sqlQuery = sqlQuery;
this.filterOverride = null; this.filterOverride = null;
this.valuesForNewTasks = valuesForNewTasks; this.valuesForNewTasks.putAll(valuesForNewTasks);
} }
public String getSqlQuery() { public String getSqlQuery() {
@ -165,7 +160,7 @@ public class Filter extends FilterListItem {
super.writeToParcel(dest, flags); super.writeToParcel(dest, flags);
dest.writeString(""); // old title dest.writeString(""); // old title
dest.writeString(sqlQuery); dest.writeString(sqlQuery);
dest.writeParcelable(valuesForNewTasks, 0); dest.writeMap(valuesForNewTasks);
} }
@Override @Override
@ -173,7 +168,7 @@ public class Filter extends FilterListItem {
super.readFromParcel(source); super.readFromParcel(source);
source.readString(); // old title source.readString(); // old title
sqlQuery = source.readString(); sqlQuery = source.readString();
valuesForNewTasks = source.readParcelable(ContentValues.class.getClassLoader()); source.readMap(valuesForNewTasks, getClass().getClassLoader());
} }
/** /**

@ -19,6 +19,10 @@ import com.todoroo.astrid.gtasks.GtasksMetadata;
import org.tasks.R; import org.tasks.R;
import java.util.Map;
import static com.todoroo.andlib.utility.AndroidUtilities.mapFromContentValues;
public class GtasksFilter extends Filter { public class GtasksFilter extends Filter {
private static final int CLOUD = R.drawable.ic_cloud_black_24dp; private static final int CLOUD = R.drawable.ic_cloud_black_24dp;
@ -57,9 +61,9 @@ public class GtasksFilter extends Filter {
.where(fullCriterion); .where(fullCriterion);
} }
private static ContentValues getValuesForNewTasks(GtasksList list) { private static Map<String, Object> getValuesForNewTasks(GtasksList list) {
ContentValues values = new ContentValues(); ContentValues contentValues = GtasksMetadata.createEmptyMetadataWithoutList(AbstractModel.NO_ID).getMergedValues();
values.putAll(GtasksMetadata.createEmptyMetadataWithoutList(AbstractModel.NO_ID).getMergedValues()); Map<String, Object> values = mapFromContentValues(contentValues);
values.remove(Metadata.TASK.name); values.remove(Metadata.TASK.name);
values.put(GtasksMetadata.LIST_ID.name, list.getRemoteId()); values.put(GtasksMetadata.LIST_ID.name, list.getRemoteId());
values.put(GtasksMetadata.ORDER.name, PermaSql.VALUE_NOW); values.put(GtasksMetadata.ORDER.name, PermaSql.VALUE_NOW);

@ -10,6 +10,8 @@ import android.graphics.Bitmap;
import android.os.Parcel; import android.os.Parcel;
import android.os.Parcelable; import android.os.Parcelable;
import java.util.Map;
/** /**
* CustomFilterCriteria allow users to build a custom filter by chaining * CustomFilterCriteria allow users to build a custom filter by chaining
* together criteria * together criteria
@ -34,12 +36,14 @@ public class MultipleSelectCriterion extends CustomFilterCriterion implements Pa
* Create a new CustomFilterCriteria object * Create a new CustomFilterCriteria object
*/ */
public MultipleSelectCriterion(String identifier, String title, String sql, public MultipleSelectCriterion(String identifier, String title, String sql,
ContentValues valuesForNewTasks, String[] entryTitles, Map<String, Object> valuesForNewTasks, String[] entryTitles,
String[] entryValues, Bitmap icon, String name) { String[] entryValues, Bitmap icon, String name) {
this.identifier = identifier; this.identifier = identifier;
this.text = title; this.text = title;
this.sql = sql; this.sql = sql;
this.valuesForNewTasks = valuesForNewTasks; if (valuesForNewTasks != null) {
this.valuesForNewTasks.putAll(valuesForNewTasks);
}
this.entryTitles = entryTitles; this.entryTitles = entryTitles;
this.entryValues = entryValues; this.entryValues = entryValues;
this.icon = icon; this.icon = icon;

@ -1,6 +1,5 @@
package com.todoroo.astrid.api; package com.todoroo.astrid.api;
import android.content.ContentValues;
import android.os.Parcel; import android.os.Parcel;
import android.os.Parcelable; import android.os.Parcelable;
@ -16,6 +15,9 @@ import com.todoroo.astrid.tags.TaskToTagMetadata;
import org.tasks.R; import org.tasks.R;
import java.util.HashMap;
import java.util.Map;
public class TagFilter extends Filter { public class TagFilter extends Filter {
private static final int TAG = R.drawable.ic_label_24dp; private static final int TAG = R.drawable.ic_label_24dp;
@ -47,12 +49,12 @@ public class TagFilter extends Filter {
.where(fullCriterion); .where(fullCriterion);
} }
private static ContentValues getValuesForNewTask(TagData tagData) { private static Map<String, Object> getValuesForNewTask(TagData tagData) {
ContentValues contentValues = new ContentValues(); Map<String, Object> values = new HashMap<>();
contentValues.put(Metadata.KEY.name, TaskToTagMetadata.KEY); values.put(Metadata.KEY.name, TaskToTagMetadata.KEY);
contentValues.put(TaskToTagMetadata.TAG_NAME.name, tagData.getName()); values.put(TaskToTagMetadata.TAG_NAME.name, tagData.getName());
contentValues.put(TaskToTagMetadata.TAG_UUID.name, tagData.getRemoteId()); values.put(TaskToTagMetadata.TAG_UUID.name, tagData.getRemoteId());
return contentValues; return values;
} }
/** /**

@ -37,7 +37,6 @@ public class TextInputCriterion extends CustomFilterCriterion implements Parcela
this.identifier = identifier; this.identifier = identifier;
this.text = title; this.text = title;
this.sql = sql; this.sql = sql;
this.valuesForNewTasks = null;
this.prompt = prompt; this.prompt = prompt;
this.hint = hint; this.hint = hint;
this.icon = icon; this.icon = icon;

@ -5,7 +5,6 @@
*/ */
package com.todoroo.astrid.core; package com.todoroo.astrid.core;
import android.content.ContentValues;
import android.content.Context; import android.content.Context;
import android.content.res.Resources; import android.content.res.Resources;
@ -27,7 +26,9 @@ import org.tasks.injection.ForApplication;
import org.tasks.preferences.Preferences; import org.tasks.preferences.Preferences;
import java.util.ArrayList; import java.util.ArrayList;
import java.util.HashMap;
import java.util.List; import java.util.List;
import java.util.Map;
import javax.inject.Inject; import javax.inject.Inject;
@ -88,7 +89,7 @@ public final class BuiltInFilterExposer {
public static Filter getTodayFilter(Resources r) { public static Filter getTodayFilter(Resources r) {
String todayTitle = AndroidUtilities.capitalize(r.getString(R.string.today)); String todayTitle = AndroidUtilities.capitalize(r.getString(R.string.today));
ContentValues todayValues = new ContentValues(); Map<String, Object> todayValues = new HashMap<>();
todayValues.put(Task.DUE_DATE.name, PermaSql.VALUE_NOON); todayValues.put(Task.DUE_DATE.name, PermaSql.VALUE_NOON);
return new Filter(todayTitle, return new Filter(todayTitle,
new QueryTemplate().where( new QueryTemplate().where(

@ -5,7 +5,6 @@
*/ */
package com.todoroo.astrid.core; package com.todoroo.astrid.core;
import android.content.ContentValues;
import android.content.Context; import android.content.Context;
import android.content.Intent; import android.content.Intent;
import android.database.Cursor; import android.database.Cursor;
@ -45,7 +44,9 @@ import org.tasks.locale.Locale;
import org.tasks.ui.MenuColorizer; import org.tasks.ui.MenuColorizer;
import java.util.ArrayList; import java.util.ArrayList;
import java.util.HashMap;
import java.util.List; import java.util.List;
import java.util.Map;
import java.util.Map.Entry; import java.util.Map.Entry;
import javax.inject.Inject; import javax.inject.Inject;
@ -231,7 +232,7 @@ public class CustomFilterActivity extends ThemedInjectingAppCompatActivity imple
} }
StringBuilder sql = new StringBuilder(" WHERE "); StringBuilder sql = new StringBuilder(" WHERE ");
ContentValues values = new ContentValues(); Map<String, Object> values = new HashMap<>();
for(int i = 0; i < adapter.getCount(); i++) { for(int i = 0; i < adapter.getCount(); i++) {
CriterionInstance instance = adapter.getItem(i); CriterionInstance instance = adapter.getItem(i);
String value = instance.getValueFromCriterion(); String value = instance.getValueFromCriterion();
@ -263,7 +264,7 @@ public class CustomFilterActivity extends ThemedInjectingAppCompatActivity imple
if(instance.criterion.valuesForNewTasks != null && if(instance.criterion.valuesForNewTasks != null &&
instance.type == CriterionInstance.TYPE_INTERSECT) { instance.type == CriterionInstance.TYPE_INTERSECT) {
for(Entry<String, Object> entry : instance.criterion.valuesForNewTasks.valueSet()) { for(Entry<String, Object> entry : instance.criterion.valuesForNewTasks.entrySet()) {
values.put(entry.getKey().replace("?", value), values.put(entry.getKey().replace("?", value),
entry.getValue().toString().replace("?", value)); entry.getValue().toString().replace("?", value));
} }

@ -5,7 +5,6 @@
*/ */
package com.todoroo.astrid.core; package com.todoroo.astrid.core;
import android.content.ContentValues;
import android.text.TextUtils; import android.text.TextUtils;
import com.todoroo.andlib.utility.AndroidUtilities; import com.todoroo.andlib.utility.AndroidUtilities;
@ -17,6 +16,7 @@ import com.todoroo.astrid.data.StoreObject;
import org.tasks.R; import org.tasks.R;
import java.util.List; import java.util.List;
import java.util.Map;
import javax.inject.Inject; import javax.inject.Inject;
@ -49,16 +49,16 @@ public final class CustomFilterExposer {
String title = savedFilter.getItem(); String title = savedFilter.getItem();
String sql = savedFilter.getValue(); String sql = savedFilter.getValue();
String values = savedFilter.getValue2(); String valuesString = savedFilter.getValue2();
ContentValues contentValues = null; Map<String, Object> values = null;
if(!TextUtils.isEmpty(values)) { if(!TextUtils.isEmpty(valuesString)) {
contentValues = AndroidUtilities.contentValuesFromSerializedString(values); values = AndroidUtilities.mapFromSerializedString(valuesString);
} }
sql = sql.replace("tasks.userId=0", "1"); // TODO: replace dirty hack for missing column sql = sql.replace("tasks.userId=0", "1"); // TODO: replace dirty hack for missing column
CustomFilter customFilter = new CustomFilter(title, sql, contentValues, savedFilter.getId()); CustomFilter customFilter = new CustomFilter(title, sql, values, savedFilter.getId());
customFilter.icon = filter; customFilter.icon = filter;
return customFilter; return customFilter;
} }

@ -5,13 +5,13 @@
*/ */
package com.todoroo.astrid.core; package com.todoroo.astrid.core;
import android.content.ContentValues;
import com.todoroo.andlib.utility.AndroidUtilities; import com.todoroo.andlib.utility.AndroidUtilities;
import com.todoroo.astrid.core.CustomFilterActivity.CriterionInstance; import com.todoroo.astrid.core.CustomFilterActivity.CriterionInstance;
import com.todoroo.astrid.dao.StoreObjectDao; import com.todoroo.astrid.dao.StoreObjectDao;
import com.todoroo.astrid.data.StoreObject; import com.todoroo.astrid.data.StoreObject;
import java.util.Map;
/** /**
* {@link StoreObject} entries for a saved custom filter * {@link StoreObject} entries for a saved custom filter
* *
@ -26,7 +26,7 @@ public class SavedFilter {
* Save a filter * Save a filter
*/ */
public static StoreObject persist(StoreObjectDao dao, CustomFilterAdapter adapter, String title, public static StoreObject persist(StoreObjectDao dao, CustomFilterAdapter adapter, String title,
String sql, ContentValues values) { String sql, Map<String, Object> values) {
if(title == null || title.length() == 0) { if(title == null || title.length() == 0) {
return null; return null;
@ -46,7 +46,7 @@ public class SavedFilter {
if(values == null) { if(values == null) {
storeObject.setValue2(""); //$NON-NLS-1$ storeObject.setValue2(""); //$NON-NLS-1$
} else { } else {
storeObject.setValue2(AndroidUtilities.contentValuesToSerializedString(values)); storeObject.setValue2(AndroidUtilities.mapToSerializedString(values));
} }
String filters = serializeFilters(adapter); String filters = serializeFilters(adapter);

@ -73,11 +73,11 @@ public class TaskCreator {
* Create task from the given content values, saving it. This version * Create task from the given content values, saving it. This version
* doesn't need to start with a base task model. * doesn't need to start with a base task model.
*/ */
public Task createWithValues(ContentValues values, String title) { public Task createWithValues(Map<String, Object> values, String title) {
return createWithValues(new Task(), values, title); return createWithValues(new Task(), values, title);
} }
Task createWithValues(Task task, ContentValues values, String title) { Task createWithValues(Task task, Map<String, Object> values, String title) {
if (title != null) { if (title != null) {
task.setTitle(title.trim()); task.setTitle(title.trim());
} }
@ -93,7 +93,7 @@ public class TaskCreator {
if (values != null && values.size() > 0) { if (values != null && values.size() > 0) {
ContentValues forTask = new ContentValues(); ContentValues forTask = new ContentValues();
forMetadata = new ContentValues(); forMetadata = new ContentValues();
outer: for (Map.Entry<String, Object> item : values.valueSet()) { outer: for (Map.Entry<String, Object> item : values.entrySet()) {
String key = item.getKey(); String key = item.getKey();
Object value = item.getValue(); Object value = item.getValue();
if (value instanceof String) { if (value instanceof String) {

@ -53,7 +53,7 @@ public class FilterSelectionActivity extends InjectingAppCompatActivity {
data.putExtra(EXTRA_FILTER_NAME, selectedFilter.listingTitle); data.putExtra(EXTRA_FILTER_NAME, selectedFilter.listingTitle);
data.putExtra(EXTRA_FILTER_SQL, selectedFilter.getSqlQuery()); data.putExtra(EXTRA_FILTER_SQL, selectedFilter.getSqlQuery());
if (selectedFilter.valuesForNewTasks != null) { if (selectedFilter.valuesForNewTasks != null) {
data.putExtra(EXTRA_FILTER_VALUES, AndroidUtilities.contentValuesToSerializedString(selectedFilter.valuesForNewTasks)); data.putExtra(EXTRA_FILTER_VALUES, AndroidUtilities.mapToSerializedString(selectedFilter.valuesForNewTasks));
} }
setResult(RESULT_OK, data); setResult(RESULT_OK, data);
dialog.dismiss(); dialog.dismiss();

@ -28,13 +28,16 @@ import org.tasks.R;
import org.tasks.gtasks.SyncAdapterHelper; import org.tasks.gtasks.SyncAdapterHelper;
import org.tasks.injection.ForApplication; import org.tasks.injection.ForApplication;
import java.util.HashMap;
import java.util.List; import java.util.List;
import java.util.Map;
import javax.inject.Inject; import javax.inject.Inject;
import static com.google.common.collect.Iterables.transform; import static com.google.common.collect.Iterables.transform;
import static com.google.common.collect.Lists.newArrayList; import static com.google.common.collect.Lists.newArrayList;
import static com.google.common.collect.Sets.newLinkedHashSet; import static com.google.common.collect.Sets.newLinkedHashSet;
import static com.todoroo.andlib.utility.AndroidUtilities.mapFromContentValues;
public class FilterCriteriaProvider { public class FilterCriteriaProvider {
@ -84,7 +87,7 @@ public class FilterCriteriaProvider {
// TODO: adding to hash set because duplicate tag name bug hasn't been fixed yet // TODO: adding to hash set because duplicate tag name bug hasn't been fixed yet
List<String> tags = newArrayList(newLinkedHashSet(transform(tagService.getTagList(), TagData::getName))); List<String> tags = newArrayList(newLinkedHashSet(transform(tagService.getTagList(), TagData::getName)));
String[] tagNames = tags.toArray(new String[tags.size()]); String[] tagNames = tags.toArray(new String[tags.size()]);
ContentValues values = new ContentValues(); Map<String, Object> values = new HashMap<>();
values.put(Metadata.KEY.name, TaskToTagMetadata.KEY); values.put(Metadata.KEY.name, TaskToTagMetadata.KEY);
values.put(TaskToTagMetadata.TAG_NAME.name, "?"); values.put(TaskToTagMetadata.TAG_NAME.name, "?");
return new MultipleSelectCriterion( return new MultipleSelectCriterion(
@ -124,7 +127,7 @@ public class FilterCriteriaProvider {
PermaSql.VALUE_EOD_NEXT_WEEK, PermaSql.VALUE_EOD_NEXT_WEEK,
PermaSql.VALUE_EOD_NEXT_MONTH, PermaSql.VALUE_EOD_NEXT_MONTH,
}; };
ContentValues values = new ContentValues(); Map<String, Object> values = new HashMap<>();
values.put(Task.DUE_DATE.name, "?"); values.put(Task.DUE_DATE.name, "?");
return new MultipleSelectCriterion( return new MultipleSelectCriterion(
IDENTIFIER_DUEDATE, IDENTIFIER_DUEDATE,
@ -151,7 +154,7 @@ public class FilterCriteriaProvider {
String[] entries = new String[] { String[] entries = new String[] {
"!!!", "!!", "!", "o" "!!!", "!!", "!", "o"
}; };
ContentValues values = new ContentValues(); Map<String, Object> values = new HashMap<>();
values.put(Task.IMPORTANCE.name, "?"); values.put(Task.IMPORTANCE.name, "?");
return new MultipleSelectCriterion( return new MultipleSelectCriterion(
IDENTIFIER_IMPORTANCE, IDENTIFIER_IMPORTANCE,
@ -165,8 +168,6 @@ public class FilterCriteriaProvider {
} }
private CustomFilterCriterion getTaskTitleContainsFilter() { private CustomFilterCriterion getTaskTitleContainsFilter() {
ContentValues values = new ContentValues();
values.put(Task.TITLE.name, "?");
return new TextInputCriterion( return new TextInputCriterion(
IDENTIFIER_TITLE, IDENTIFIER_TITLE,
r.getString(R.string.CFC_title_contains_text), r.getString(R.string.CFC_title_contains_text),
@ -188,8 +189,8 @@ public class FilterCriteriaProvider {
listIds[i] = lists.get(i).getRemoteId(); listIds[i] = lists.get(i).getRemoteId();
} }
ContentValues values = new ContentValues(); ContentValues contentValues = gtasksMetadata.createEmptyMetadata(AbstractModel.NO_ID).getMergedValues();
values.putAll(gtasksMetadata.createEmptyMetadata(AbstractModel.NO_ID).getMergedValues()); Map<String, Object> values = mapFromContentValues(contentValues);
values.remove(Metadata.TASK.name); values.remove(Metadata.TASK.name);
values.put(GtasksMetadata.LIST_ID.name, "?"); values.put(GtasksMetadata.LIST_ID.name, "?");

Loading…
Cancel
Save