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