diff --git a/astrid/astrid.launch b/astrid/astrid.launch index e1e654a56..cb6cda0f4 100644 --- a/astrid/astrid.launch +++ b/astrid/astrid.launch @@ -4,7 +4,7 @@ - + diff --git a/astrid/plugin-src/com/todoroo/astrid/core/CoreFilterExposer.java b/astrid/plugin-src/com/todoroo/astrid/core/CoreFilterExposer.java index 39d793148..df998d898 100644 --- a/astrid/plugin-src/com/todoroo/astrid/core/CoreFilterExposer.java +++ b/astrid/plugin-src/com/todoroo/astrid/core/CoreFilterExposer.java @@ -111,7 +111,6 @@ public final class CoreFilterExposer extends BroadcastReceiver { * Build inbox filter * @return */ - @SuppressWarnings("nls") public static Filter buildInboxFilter(Resources r) { Filter inbox = new Filter(CorePlugin.IDENTIFIER, r.getString(R.string.BFE_Active), r.getString(R.string.BFE_Active_title), diff --git a/astrid/plugin-src/com/todoroo/astrid/core/CorePlugin.java b/astrid/plugin-src/com/todoroo/astrid/core/CorePlugin.java index 531475e2d..c76847423 100644 --- a/astrid/plugin-src/com/todoroo/astrid/core/CorePlugin.java +++ b/astrid/plugin-src/com/todoroo/astrid/core/CorePlugin.java @@ -9,7 +9,7 @@ import com.todoroo.astrid.api.AstridApiConstants; public class CorePlugin extends BroadcastReceiver { - static final String IDENTIFIER = "core"; + static final String IDENTIFIER = "core"; //$NON-NLS-1$ @Override public void onReceive(Context context, Intent intent) { diff --git a/astrid/plugin-src/com/todoroo/astrid/notes/NotesPlugin.java b/astrid/plugin-src/com/todoroo/astrid/notes/NotesPlugin.java index 4e8f68997..2948c27b8 100644 --- a/astrid/plugin-src/com/todoroo/astrid/notes/NotesPlugin.java +++ b/astrid/plugin-src/com/todoroo/astrid/notes/NotesPlugin.java @@ -9,7 +9,7 @@ import com.todoroo.astrid.api.AstridApiConstants; public class NotesPlugin extends BroadcastReceiver { - static final String IDENTIFIER = "notes"; + static final String IDENTIFIER = "notes"; //$NON-NLS-1$ @Override public void onReceive(Context context, Intent intent) { diff --git a/astrid/plugin-src/com/todoroo/astrid/tags/TagFilterExposer.java b/astrid/plugin-src/com/todoroo/astrid/tags/TagFilterExposer.java index 099c503c9..475c2498b 100644 --- a/astrid/plugin-src/com/todoroo/astrid/tags/TagFilterExposer.java +++ b/astrid/plugin-src/com/todoroo/astrid/tags/TagFilterExposer.java @@ -17,6 +17,7 @@ import com.todoroo.astrid.api.Filter; import com.todoroo.astrid.api.FilterCategory; import com.todoroo.astrid.api.FilterListHeader; import com.todoroo.astrid.api.FilterListItem; +import com.todoroo.astrid.model.Metadata; import com.todoroo.astrid.tags.TagService.Tag; /** @@ -36,7 +37,8 @@ public class TagFilterExposer extends BroadcastReceiver { String title = context.getString(R.string.tag_FEx_name, tag.tag); QueryTemplate tagTemplate = tag.queryTemplate(); ContentValues contentValues = new ContentValues(); - contentValues.put(TagService.KEY, tag.tag); + contentValues.put(Metadata.KEY.name, TagService.KEY); + contentValues.put(TagService.TAG.name, tag.tag); Filter filter = new Filter(TagsPlugin.IDENTIFIER, listTitle, title, diff --git a/astrid/plugin-src/com/todoroo/astrid/tags/TagService.java b/astrid/plugin-src/com/todoroo/astrid/tags/TagService.java index d81a7acdf..ea72aaa46 100644 --- a/astrid/plugin-src/com/todoroo/astrid/tags/TagService.java +++ b/astrid/plugin-src/com/todoroo/astrid/tags/TagService.java @@ -4,6 +4,7 @@ import java.util.ArrayList; import com.todoroo.andlib.data.TodorooCursor; import com.todoroo.andlib.data.Property.CountProperty; +import com.todoroo.andlib.data.Property.StringProperty; import com.todoroo.andlib.service.Autowired; import com.todoroo.andlib.service.DependencyInjectionService; import com.todoroo.andlib.sql.Criterion; @@ -17,7 +18,6 @@ import com.todoroo.astrid.dao.MetadataDao.MetadataCriteria; import com.todoroo.astrid.dao.TaskDao.TaskCriteria; import com.todoroo.astrid.model.Metadata; import com.todoroo.astrid.model.Task; -import com.todoroo.astrid.service.MetadataService; /** * Provides operations for working with tags @@ -28,27 +28,28 @@ import com.todoroo.astrid.service.MetadataService; @SuppressWarnings("nls") public class TagService { - /** - * Metadata key for tag data - */ - public static final String KEY = "tags-tag"; + // --- public constants - @Autowired - private MetadataDao metadataDao; + /** Metadata key for tag data */ + public static final String KEY = "tags"; + + /** Property for reading tag values */ + public static final StringProperty TAG = Metadata.VALUE1; + + // --- implementation details @Autowired - private MetadataService metadataService; + private MetadataDao metadataDao; public TagService() { DependencyInjectionService.getInstance().inject(this); } - /** * Property for retrieving count of aggregated rows */ private static final CountProperty COUNT = new CountProperty(); - public static final Order GROUPED_TAGS_BY_ALPHA = Order.asc(Metadata.VALUE); + public static final Order GROUPED_TAGS_BY_ALPHA = Order.asc(TAG); public static final Order GROUPED_TAGS_BY_SIZE = Order.desc(COUNT); /** @@ -75,7 +76,7 @@ public class TagService { public QueryTemplate queryTemplate() { return new QueryTemplate().join(Join.inner(Metadata.TABLE, Task.ID.eq(Metadata.TASK))).where(Criterion.and( - MetadataCriteria.withKey(KEY), Metadata.VALUE.eq(tag), + MetadataCriteria.withKey(KEY), TAG.eq(tag), TaskCriteria.isActive())); } } @@ -94,14 +95,17 @@ public class TagService { * @return empty array if no tags, otherwise array */ public Tag[] getGroupedTags(Order order) { - TodorooCursor cursor = metadataService.fetchWithCount( - COUNT, Criterion.and(TaskCriteria.isActive(), MetadataCriteria.withKey(KEY)), order); + Query query = Query.select(TAG, COUNT). + join(Join.inner(Task.TABLE, Metadata.TASK.eq(Task.ID))). + where(Criterion.and(TaskCriteria.isActive(), MetadataCriteria.withKey(KEY))). + orderBy(order).groupBy(TAG); + TodorooCursor cursor = metadataDao.query(query); try { Tag[] array = new Tag[cursor.getCount()]; for (int i = 0; i < array.length; i++) { cursor.moveToNext(); array[i] = new Tag(); - array[i].tag = cursor.get(Metadata.VALUE); + array[i].tag = cursor.get(TAG); array[i].count = cursor.get(COUNT); } return array; @@ -117,7 +121,7 @@ public class TagService { * @return cursor. PLEASE CLOSE THE CURSOR! */ public TodorooCursor getTags(long taskId) { - Query query = Query.select(Metadata.VALUE).where(Criterion.and(MetadataCriteria.withKey(KEY), + Query query = Query.select(TAG).where(Criterion.and(MetadataCriteria.withKey(KEY), MetadataCriteria.byTask(taskId))); return metadataDao.query(query); } @@ -137,7 +141,7 @@ public class TagService { for (int i = 0; i < length; i++) { tags.moveToNext(); metadata.readFromCursor(tags); - tagBuilder.append(metadata.getValue(Metadata.VALUE)); + tagBuilder.append(metadata.getValue(TAG)); if (i < length - 1) tagBuilder.append(", "); } @@ -160,7 +164,7 @@ public class TagService { metadata.setValue(Metadata.KEY, KEY); metadata.setValue(Metadata.TASK, taskId); for(String tag : tags) { - metadata.setValue(Metadata.VALUE, tag.trim()); + metadata.setValue(TAG, tag.trim()); metadataDao.createNew(metadata); } } diff --git a/astrid/plugin-src/com/todoroo/astrid/tags/TagsControlSet.java b/astrid/plugin-src/com/todoroo/astrid/tags/TagsControlSet.java index 50fb93488..6be23f151 100644 --- a/astrid/plugin-src/com/todoroo/astrid/tags/TagsControlSet.java +++ b/astrid/plugin-src/com/todoroo/astrid/tags/TagsControlSet.java @@ -54,7 +54,7 @@ public final class TagsControlSet implements TaskEditControlSet { TodorooCursor cursor = tagService.getTags(task.getId()); try { for(cursor.moveToFirst(); !cursor.isAfterLast(); cursor.moveToNext()) - addTag(cursor.get(Metadata.VALUE)); + addTag(cursor.get(TagService.TAG)); } finally { cursor.close(); } diff --git a/astrid/src/com/todoroo/astrid/activity/TaskListActivity.java b/astrid/src/com/todoroo/astrid/activity/TaskListActivity.java index 17f8a5c97..786538841 100644 --- a/astrid/src/com/todoroo/astrid/activity/TaskListActivity.java +++ b/astrid/src/com/todoroo/astrid/activity/TaskListActivity.java @@ -345,13 +345,9 @@ public class TaskListActivity extends ListActivity implements OnScrollListener { taskService.save(task, false); if(forMetadata != null && forMetadata.size() > 0) { Metadata metadata = new Metadata(); - for(Entry item : forMetadata.valueSet()) { - metadata.setValue(Metadata.TASK, task.getId()); - metadata.setValue(Metadata.KEY, item.getKey()); - metadata.setValue(Metadata.VALUE, item.getValue().toString()); - metadataService.save(metadata); - metadata.clear(); - } + metadata.setValue(Metadata.TASK, task.getId()); + metadata.mergeWith(forMetadata); + metadataService.save(metadata); } TextView quickAdd = (TextView)findViewById(R.id.quickAddText); diff --git a/astrid/src/com/todoroo/astrid/adapter/FilterAdapter.java b/astrid/src/com/todoroo/astrid/adapter/FilterAdapter.java index 7d9578372..0c24e7b04 100644 --- a/astrid/src/com/todoroo/astrid/adapter/FilterAdapter.java +++ b/astrid/src/com/todoroo/astrid/adapter/FilterAdapter.java @@ -125,6 +125,7 @@ public class FilterAdapter extends BaseExpandableListAdapter { FrameLayout.LayoutParams expansionImageLayout = new FrameLayout.LayoutParams( 32, 32); expansionImageLayout.gravity = Gravity.CENTER_VERTICAL; + image.setPadding(5, 0, 5, 0); image.setLayoutParams(expansionImageLayout); image.setScaleType(ScaleType.FIT_CENTER); layout.addView(image); diff --git a/astrid/src/com/todoroo/astrid/dao/Database.java b/astrid/src/com/todoroo/astrid/dao/Database.java index 6c1ec9f38..462038e1e 100644 --- a/astrid/src/com/todoroo/astrid/dao/Database.java +++ b/astrid/src/com/todoroo/astrid/dao/Database.java @@ -6,6 +6,7 @@ package com.todoroo.astrid.dao; import com.todoroo.andlib.data.AbstractDatabase; +import com.todoroo.andlib.data.Property; import com.todoroo.andlib.data.Table; import com.todoroo.astrid.model.Metadata; import com.todoroo.astrid.model.Task; @@ -25,7 +26,7 @@ public class Database extends AbstractDatabase { * Database version number. This variable must be updated when database * tables are updated, as it determines whether a database needs updating. */ - public static final int VERSION = 2; + public static final int VERSION = 3; /** * Database name (must be unique) @@ -76,13 +77,19 @@ public class Database extends AbstractDatabase { switch(oldVersion) { case 1: { SqlConstructorVisitor visitor = new SqlConstructorVisitor(); - String sql = "ALTER TABLE " + Task.TABLE.name + " ADD " + - Task.RECURRENCE.accept(visitor, null); - database.execSQL(sql); - return true; + database.execSQL("ALTER TABLE " + Task.TABLE.name + " ADD " + + Task.RECURRENCE.accept(visitor, null)); } + case 2: { + SqlConstructorVisitor visitor = new SqlConstructorVisitor(); + for(Property property : new Property[] { Metadata.VALUE2, + Metadata.VALUE3, Metadata.VALUE4, Metadata.VALUE5 }) + database.execSQL("ALTER TABLE " + Metadata.TABLE.name + " ADD " + + property.accept(visitor, null)); } + return true; + } return false; } diff --git a/astrid/src/com/todoroo/astrid/dao/IntegerJoinProperty.java b/astrid/src/com/todoroo/astrid/dao/IntegerJoinProperty.java deleted file mode 100644 index a2c488cb9..000000000 --- a/astrid/src/com/todoroo/astrid/dao/IntegerJoinProperty.java +++ /dev/null @@ -1,22 +0,0 @@ -package com.todoroo.astrid.dao; - -import com.todoroo.andlib.data.Property.IntegerProperty; -import com.todoroo.astrid.model.Metadata; - -/** - * Helper class for representing string columns from joined metadata - */ -public class IntegerJoinProperty extends IntegerProperty implements JoinProperty { - - public IntegerJoinProperty(String name) { - super(null, name); - } - - @SuppressWarnings("nls") - public String joinTable() { - return String.format("SELECT %s,%s AS %s FROM %s WHERE %s='%s'", - Metadata.TASK, Metadata.VALUE, name, - Metadata.TABLE, Metadata.KEY, name); - } - -} \ No newline at end of file diff --git a/astrid/src/com/todoroo/astrid/dao/JoinProperty.java b/astrid/src/com/todoroo/astrid/dao/JoinProperty.java deleted file mode 100644 index 44ee9914f..000000000 --- a/astrid/src/com/todoroo/astrid/dao/JoinProperty.java +++ /dev/null @@ -1,14 +0,0 @@ -/** - * See the file "LICENSE" for the full license governing this code. - */ -package com.todoroo.astrid.dao; - -public interface JoinProperty { - - /** - * @return SQL select statement describing how to load this property - * in a join statement - */ - public String joinTable(); - -} diff --git a/astrid/src/com/todoroo/astrid/dao/MetadataDao.java b/astrid/src/com/todoroo/astrid/dao/MetadataDao.java index be9d739f7..b216e9101 100644 --- a/astrid/src/com/todoroo/astrid/dao/MetadataDao.java +++ b/astrid/src/com/todoroo/astrid/dao/MetadataDao.java @@ -62,7 +62,7 @@ public class MetadataDao extends GenericDao { * @param properties * @return */ - public TodorooCursor fetchDangling(Property[] properties) { + public TodorooCursor fetchDangling(Property... properties) { Query sql = Query.select(properties).from(Metadata.TABLE).join(Join.left(Task.TABLE, Metadata.TASK.eq(Task.ID))).where(Task.TITLE.isNull()); Cursor cursor = database.rawQuery(sql.toString(), null); diff --git a/astrid/src/com/todoroo/astrid/dao/StringJoinProperty.java b/astrid/src/com/todoroo/astrid/dao/StringJoinProperty.java deleted file mode 100644 index c47a6e972..000000000 --- a/astrid/src/com/todoroo/astrid/dao/StringJoinProperty.java +++ /dev/null @@ -1,21 +0,0 @@ -package com.todoroo.astrid.dao; - -import com.todoroo.andlib.data.Property.StringProperty; -import com.todoroo.astrid.model.Metadata; - -/** - * Helper class for representing string columns from another table - */ -public class StringJoinProperty extends StringProperty implements JoinProperty { - - public StringJoinProperty(String name) { - super(null, name); - } - - @SuppressWarnings("nls") - public String joinTable() { - return String.format("SELECT %s,%s AS %s FROM %s WHERE %s='%s'", - Metadata.TASK, Metadata.VALUE, name, - Metadata.TABLE, Metadata.KEY, name); - } -} \ No newline at end of file diff --git a/astrid/src/com/todoroo/astrid/model/Metadata.java b/astrid/src/com/todoroo/astrid/model/Metadata.java index 655fdcb46..84406a3b2 100644 --- a/astrid/src/com/todoroo/astrid/model/Metadata.java +++ b/astrid/src/com/todoroo/astrid/model/Metadata.java @@ -8,10 +8,10 @@ import android.content.ContentValues; import com.todoroo.andlib.data.AbstractModel; import com.todoroo.andlib.data.Property; -import com.todoroo.andlib.data.Property.LongProperty; -import com.todoroo.andlib.data.Property.StringProperty; import com.todoroo.andlib.data.Table; import com.todoroo.andlib.data.TodorooCursor; +import com.todoroo.andlib.data.Property.LongProperty; +import com.todoroo.andlib.data.Property.StringProperty; /** * Data Model which represents a piece of metadata associated with a task @@ -40,10 +40,26 @@ public class Metadata extends AbstractModel { public static final StringProperty KEY = new StringProperty( TABLE, "key"); - /** Metadata Text Value */ - public static final StringProperty VALUE = new StringProperty( + /** Metadata Text Value Column 1 */ + public static final StringProperty VALUE1 = new StringProperty( TABLE, "value"); + /** Metadata Text Value Column 2 */ + public static final StringProperty VALUE2 = new StringProperty( + TABLE, "value2"); + + /** Metadata Text Value Column 1 */ + public static final StringProperty VALUE3 = new StringProperty( + TABLE, "value3"); + + /** Metadata Text Value Column 1 */ + public static final StringProperty VALUE4 = new StringProperty( + TABLE, "value4"); + + /** Metadata Text Value Column 1 */ + public static final StringProperty VALUE5 = new StringProperty( + TABLE, "value5"); + /** List of all properties for this model */ public static final Property[] PROPERTIES = generateProperties(Metadata.class); diff --git a/astrid/src/com/todoroo/astrid/service/Astrid2To3UpgradeHelper.java b/astrid/src/com/todoroo/astrid/service/Astrid2To3UpgradeHelper.java index 3fe0e39cf..105b93aca 100644 --- a/astrid/src/com/todoroo/astrid/service/Astrid2To3UpgradeHelper.java +++ b/astrid/src/com/todoroo/astrid/service/Astrid2To3UpgradeHelper.java @@ -12,8 +12,8 @@ import android.content.SharedPreferences; import android.content.SharedPreferences.Editor; import android.database.Cursor; import android.database.sqlite.SQLiteDatabase; -import android.database.sqlite.SQLiteDatabase.CursorFactory; import android.database.sqlite.SQLiteOpenHelper; +import android.database.sqlite.SQLiteDatabase.CursorFactory; import android.util.Log; import com.google.ical.values.Frequency; @@ -414,7 +414,7 @@ public class Astrid2To3UpgradeHelper { long task = mapCursor.getLong(1); metadata.setValue(Metadata.TASK, task); metadata.setValue(Metadata.KEY, TagService.KEY); - metadata.setValue(Metadata.VALUE, tag); + metadata.setValue(TagService.TAG, tag); metadataDao.createNew(metadata); metadata.clearValue(Metadata.ID); } diff --git a/astrid/src/com/todoroo/astrid/service/MetadataService.java b/astrid/src/com/todoroo/astrid/service/MetadataService.java index 90a1e07e3..1400a7860 100644 --- a/astrid/src/com/todoroo/astrid/service/MetadataService.java +++ b/astrid/src/com/todoroo/astrid/service/MetadataService.java @@ -1,17 +1,12 @@ package com.todoroo.astrid.service; -import com.todoroo.andlib.data.Property; -import com.todoroo.andlib.data.Property.CountProperty; import com.todoroo.andlib.data.TodorooCursor; import com.todoroo.andlib.service.Autowired; import com.todoroo.andlib.service.DependencyInjectionService; import com.todoroo.andlib.sql.Criterion; -import com.todoroo.andlib.sql.Join; -import com.todoroo.andlib.sql.Order; import com.todoroo.andlib.sql.Query; import com.todoroo.astrid.dao.MetadataDao; import com.todoroo.astrid.model.Metadata; -import com.todoroo.astrid.model.Task; /** * Service layer for {@link Metadata}-centered activities. @@ -28,29 +23,13 @@ public class MetadataService { DependencyInjectionService.getInstance().inject(this); } - // --- property list - - /** - * @return property list containing just task id's - */ - public static Property[] idProperty() { - return new Property[] { Metadata.ID }; - } - - /** - * @return property list containing just task id's - */ - public static Property[] valueProperty() { - return new Property[] { Metadata.VALUE }; - } - // --- service layer /** * Clean up metadata. Typically called on startup */ public void cleanup() { - TodorooCursor cursor = metadataDao.fetchDangling(idProperty()); + TodorooCursor cursor = metadataDao.fetchDangling(Metadata.ID); try { if(cursor.getCount() == 0) return; @@ -65,17 +44,12 @@ public class MetadataService { } /** - * Retrieve count of all metadata grouped by value - * @param where SQL where clause - * @param onlyCountsGreaterThanZero only include items where count > 0 + * Query underlying database + * @param query + * @return */ - public TodorooCursor fetchWithCount(CountProperty count, - Criterion where, Order order) { - Query query = Query.select(Metadata.VALUE.as(Metadata.VALUE.name), count). - join(Join.inner(Task.TABLE, Metadata.TASK.eq(Task.ID))). - where(where).orderBy(order).groupBy(Metadata.VALUE); - TodorooCursor cursor = metadataDao.query(query); - return cursor; + public TodorooCursor query(Query query) { + return metadataDao.query(query); } /** diff --git a/astrid/src/com/todoroo/astrid/service/TaskService.java b/astrid/src/com/todoroo/astrid/service/TaskService.java index cf3e9fc89..9ae6ec64e 100644 --- a/astrid/src/com/todoroo/astrid/service/TaskService.java +++ b/astrid/src/com/todoroo/astrid/service/TaskService.java @@ -10,8 +10,8 @@ import com.todoroo.andlib.sql.Query; import com.todoroo.andlib.utility.DateUtilities; import com.todoroo.astrid.api.Filter; import com.todoroo.astrid.dao.MetadataDao; -import com.todoroo.astrid.dao.MetadataDao.MetadataCriteria; import com.todoroo.astrid.dao.TaskDao; +import com.todoroo.astrid.dao.MetadataDao.MetadataCriteria; import com.todoroo.astrid.dao.TaskDao.TaskCriteria; import com.todoroo.astrid.model.Metadata; import com.todoroo.astrid.model.Task; @@ -36,6 +36,15 @@ public class TaskService { // --- service layer + /** + * Query underlying database + * @param query + * @return + */ + public TodorooCursor query(Query query) { + return taskDao.query(query); + } + /** * * @param properties