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.InputStream;
import java.io.OutputStream;
import java.util.HashMap;
import java.util.Map;
import java.util.Map.Entry;
import timber.log.Timber;
@ -80,9 +82,9 @@ public class AndroidUtilities {
/**
* 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();
for(Entry<String, Object> entry : source.valueSet()) {
for(Entry<String, Object> entry : source.entrySet()) {
addSerialized(result, entry.getKey(), entry.getValue());
}
return result.toString();
@ -109,17 +111,14 @@ public class AndroidUtilities {
result.append(SERIALIZATION_SEPARATOR);
}
/**
* Turn ContentValues into a string
*/
public static ContentValues contentValuesFromSerializedString(String string) {
if(string == null) {
return new ContentValues();
public static Map<String, Object> mapFromSerializedString(String string) {
if (string == null) {
return new HashMap<>();
}
ContentValues result = new ContentValues();
Map<String, Object> result = new HashMap<>();
fromSerialized(string, result, (object, key, type, value) -> {
switch(type) {
switch (type) {
case 'i':
object.put(key, Integer.parseInt(value));
break;
@ -140,6 +139,14 @@ public class AndroidUtilities {
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> {
void put(T object, String key, char type, String value) throws NumberFormatException;
}

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

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

@ -5,11 +5,13 @@
*/
package com.todoroo.astrid.api;
import android.content.ContentValues;
import android.graphics.Bitmap;
import android.os.Parcel;
import android.os.Parcelable;
import java.util.HashMap;
import java.util.Map;
/**
* CustomFilterCriteria allow users to build a custom filter by chaining
* 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
* 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
@ -74,7 +76,7 @@ abstract public class CustomFilterCriterion implements Parcelable {
dest.writeString(identifier);
dest.writeString(text);
dest.writeString(sql);
dest.writeParcelable(valuesForNewTasks, 0);
dest.writeMap(valuesForNewTasks);
dest.writeParcelable(icon, 0);
dest.writeString(name);
}
@ -86,7 +88,7 @@ abstract public class CustomFilterCriterion implements Parcelable {
identifier = source.readString();
text = source.readString();
sql = source.readString();
valuesForNewTasks = source.readParcelable(ContentValues.class.getClassLoader());
source.readMap(valuesForNewTasks, getClass().getClassLoader());
icon = source.readParcelable(Bitmap.class.getClassLoader());
name = source.readString();
}

@ -5,12 +5,15 @@
*/
package com.todoroo.astrid.api;
import android.content.ContentValues;
import android.os.Parcel;
import android.os.Parcelable;
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
* something in common.
@ -24,14 +27,6 @@ import com.todoroo.andlib.sql.QueryTemplate;
*/
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
* 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
* 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) {
this(listingTitle, sqlQuery, null);
this(listingTitle, sqlQuery, Collections.emptyMap());
}
/**
@ -74,7 +69,7 @@ public class Filter extends FilterListItem {
* @param sqlQuery
* 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(),
valuesForNewTasks);
}
@ -86,11 +81,11 @@ public class Filter extends FilterListItem {
* @param sqlQuery
* 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.sqlQuery = sqlQuery;
this.filterOverride = null;
this.valuesForNewTasks = valuesForNewTasks;
this.valuesForNewTasks.putAll(valuesForNewTasks);
}
public String getSqlQuery() {
@ -165,7 +160,7 @@ public class Filter extends FilterListItem {
super.writeToParcel(dest, flags);
dest.writeString(""); // old title
dest.writeString(sqlQuery);
dest.writeParcelable(valuesForNewTasks, 0);
dest.writeMap(valuesForNewTasks);
}
@Override
@ -173,7 +168,7 @@ public class Filter extends FilterListItem {
super.readFromParcel(source);
source.readString(); // old title
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 java.util.Map;
import static com.todoroo.andlib.utility.AndroidUtilities.mapFromContentValues;
public class GtasksFilter extends Filter {
private static final int CLOUD = R.drawable.ic_cloud_black_24dp;
@ -57,9 +61,9 @@ public class GtasksFilter extends Filter {
.where(fullCriterion);
}
private static ContentValues getValuesForNewTasks(GtasksList list) {
ContentValues values = new ContentValues();
values.putAll(GtasksMetadata.createEmptyMetadataWithoutList(AbstractModel.NO_ID).getMergedValues());
private static Map<String, Object> getValuesForNewTasks(GtasksList list) {
ContentValues contentValues = GtasksMetadata.createEmptyMetadataWithoutList(AbstractModel.NO_ID).getMergedValues();
Map<String, Object> values = mapFromContentValues(contentValues);
values.remove(Metadata.TASK.name);
values.put(GtasksMetadata.LIST_ID.name, list.getRemoteId());
values.put(GtasksMetadata.ORDER.name, PermaSql.VALUE_NOW);

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

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

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

@ -5,7 +5,6 @@
*/
package com.todoroo.astrid.core;
import android.content.ContentValues;
import android.content.Context;
import android.content.res.Resources;
@ -27,7 +26,9 @@ import org.tasks.injection.ForApplication;
import org.tasks.preferences.Preferences;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import javax.inject.Inject;
@ -88,7 +89,7 @@ public final class BuiltInFilterExposer {
public static Filter getTodayFilter(Resources r) {
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);
return new Filter(todayTitle,
new QueryTemplate().where(

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

@ -5,7 +5,6 @@
*/
package com.todoroo.astrid.core;
import android.content.ContentValues;
import android.text.TextUtils;
import com.todoroo.andlib.utility.AndroidUtilities;
@ -17,6 +16,7 @@ import com.todoroo.astrid.data.StoreObject;
import org.tasks.R;
import java.util.List;
import java.util.Map;
import javax.inject.Inject;
@ -49,16 +49,16 @@ public final class CustomFilterExposer {
String title = savedFilter.getItem();
String sql = savedFilter.getValue();
String values = savedFilter.getValue2();
String valuesString = savedFilter.getValue2();
ContentValues contentValues = null;
if(!TextUtils.isEmpty(values)) {
contentValues = AndroidUtilities.contentValuesFromSerializedString(values);
Map<String, Object> values = null;
if(!TextUtils.isEmpty(valuesString)) {
values = AndroidUtilities.mapFromSerializedString(valuesString);
}
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;
return customFilter;
}

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

@ -73,11 +73,11 @@ public class TaskCreator {
* Create task from the given content values, saving it. This version
* 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);
}
Task createWithValues(Task task, ContentValues values, String title) {
Task createWithValues(Task task, Map<String, Object> values, String title) {
if (title != null) {
task.setTitle(title.trim());
}
@ -93,7 +93,7 @@ public class TaskCreator {
if (values != null && values.size() > 0) {
ContentValues forTask = 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();
Object value = item.getValue();
if (value instanceof String) {

@ -53,7 +53,7 @@ public class FilterSelectionActivity extends InjectingAppCompatActivity {
data.putExtra(EXTRA_FILTER_NAME, selectedFilter.listingTitle);
data.putExtra(EXTRA_FILTER_SQL, selectedFilter.getSqlQuery());
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);
dialog.dismiss();

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

Loading…
Cancel
Save