/** * Copyright (c) 2012 Todoroo Inc * * See the file "LICENSE" for the full license governing this code. */ package com.todoroo.astrid.core; import android.content.ContentValues; import android.text.TextUtils; import com.todoroo.andlib.data.Property.StringProperty; import com.todoroo.andlib.data.TodorooCursor; import com.todoroo.andlib.sql.Query; import com.todoroo.andlib.utility.AndroidUtilities; import com.todoroo.astrid.api.Filter; import com.todoroo.astrid.core.CustomFilterActivity.CriterionInstance; import com.todoroo.astrid.dao.StoreObjectDao; import com.todoroo.astrid.data.StoreObject; /** * {@link StoreObject} entries for a saved custom filter * * @author Tim Su <tim@todoroo.com> * */ public class SavedFilter { /** type */ public static final String TYPE = "filter"; //$NON-NLS-1$ /** saved filter name */ public static final StringProperty NAME = new StringProperty(StoreObject.TABLE, StoreObject.ITEM.name); /** perma-sql */ public static final StringProperty SQL = new StringProperty(StoreObject.TABLE, StoreObject.VALUE1.name); /** serialized new task content values */ public static final StringProperty VALUES = new StringProperty(StoreObject.TABLE, StoreObject.VALUE2.name); /** serialized list of filters applied */ public static final StringProperty FILTERS = new StringProperty(StoreObject.TABLE, StoreObject.VALUE3.name); // --- data storage and retrieval methods /** * Save a filter * * @param adapter * @param title * @param sql2 * @param values2 */ public static void persist(CustomFilterAdapter adapter, String title, String sql, ContentValues values) { if(title == null || title.length() == 0) return; // if filter of this name exists, edit it StoreObjectDao dao = PluginServices.getStoreObjectDao(); StoreObject storeObject = new StoreObject(); TodorooCursor<StoreObject> cursor = dao.query(Query.select(StoreObject.ID).where(NAME.eq(title))); try { if(!cursor.isAfterLast()) { cursor.moveToNext(); storeObject.readFromCursor(cursor); } } finally { cursor.close(); } // populate saved filter properties storeObject.setValue(StoreObject.TYPE, TYPE); storeObject.setValue(NAME, title); storeObject.setValue(SQL, sql); if(values == null) storeObject.setValue(VALUES, ""); //$NON-NLS-1$ else storeObject.setValue(VALUES, AndroidUtilities.contentValuesToSerializedString(values)); String filters = serializeFilters(adapter); storeObject.setValue(FILTERS, filters); dao.persist(storeObject); } /** * Turn a series of CriterionInstance objects into a string * @param adapter * @return */ private static String serializeFilters(CustomFilterAdapter adapter) { StringBuilder values = new StringBuilder(); for(int i = 0; i < adapter.getCount(); i++) { CriterionInstance item = adapter.getItem(i); // criterion|entry|text|type|sql values.append(escape(item.criterion.identifier)).append(AndroidUtilities.SERIALIZATION_SEPARATOR); values.append(escape(item.getValueFromCriterion())).append(AndroidUtilities.SERIALIZATION_SEPARATOR); values.append(escape(item.criterion.text)).append(AndroidUtilities.SERIALIZATION_SEPARATOR); values.append(item.type).append(AndroidUtilities.SERIALIZATION_SEPARATOR); if(item.criterion.sql != null) values.append(item.criterion.sql); values.append('\n'); } return values.toString(); } private static String escape(String item) { if(item == null) return ""; //$NON-NLS-1$ return item.replace(AndroidUtilities.SERIALIZATION_SEPARATOR, AndroidUtilities.SEPARATOR_ESCAPE); } /** * Read filter from store * @param savedFilter * @return */ public static Filter 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); return new Filter(title, title, sql, contentValues); } }