From 8fee29ef5567321db14b074ddef6f7c22b1d5524 Mon Sep 17 00:00:00 2001 From: Tim Su Date: Fri, 6 Aug 2010 17:59:58 -0700 Subject: [PATCH] Completed step 1 of alarms - the control set --- .../com/todoroo/andlib/sql/Query.java | 4 +- .../com/todoroo/astrid/alarms/Alarm.java | 99 ++--------------- .../astrid/alarms/AlarmControlSet.java | 101 +++++++++++++++++ .../todoroo/astrid/alarms/AlarmDatabase.java | 17 +-- .../todoroo/astrid/alarms/AlarmService.java | 57 +++++----- .../astrid/alarms/TransitionalAlarm.java | 102 ++++++++++++++++++ .../astrid/backup/TasksXmlImporter.java | 4 +- .../todoroo/astrid/tags/TagFilterExposer.java | 8 +- .../com/todoroo/astrid/tags/TagService.java | 20 ++-- .../todoroo/astrid/tags/TagsControlSet.java | 7 +- astrid/res/layout/alarm_control.xml | 23 ++++ astrid/res/layout/alarm_edit_row.xml | 42 ++++++++ astrid/res/values/strings-alarms.xml | 16 +++ .../astrid/activity/TaskEditActivity.java | 12 ++- .../astrid/provider/Astrid2TaskProvider.java | 3 +- .../service/Astrid2To3UpgradeHelper.java | 10 +- .../todoroo/astrid/widget/TasksWidget.java | 4 +- .../upgrade/Astrid2To3UpgradeTests.java | 10 +- 18 files changed, 376 insertions(+), 163 deletions(-) create mode 100644 astrid/plugin-src/com/todoroo/astrid/alarms/AlarmControlSet.java create mode 100644 astrid/plugin-src/com/todoroo/astrid/alarms/TransitionalAlarm.java create mode 100644 astrid/res/layout/alarm_control.xml create mode 100644 astrid/res/layout/alarm_edit_row.xml create mode 100644 astrid/res/values/strings-alarms.xml diff --git a/astrid/common-src/com/todoroo/andlib/sql/Query.java b/astrid/common-src/com/todoroo/andlib/sql/Query.java index 620087ced..7cc16c459 100644 --- a/astrid/common-src/com/todoroo/andlib/sql/Query.java +++ b/astrid/common-src/com/todoroo/andlib/sql/Query.java @@ -89,14 +89,14 @@ public final class Query { visitSelectClause(sql); visitFromClause(sql); + visitJoinClause(sql); if(queryTemplate == null) { - visitJoinClause(sql); visitWhereClause(sql); visitGroupByClause(sql); visitOrderByClause(sql); visitLimitClause(sql); } else { - if(joins.size() > 0 || groupBies.size() > 0 || orders.size() > 0 || + if(groupBies.size() > 0 || orders.size() > 0 || havings.size() > 0) throw new IllegalStateException("Can't have extras AND query template"); //$NON-NLS-1$ sql.append(queryTemplate); diff --git a/astrid/plugin-src/com/todoroo/astrid/alarms/Alarm.java b/astrid/plugin-src/com/todoroo/astrid/alarms/Alarm.java index 47b1fba67..29e0e7d0a 100644 --- a/astrid/plugin-src/com/todoroo/astrid/alarms/Alarm.java +++ b/astrid/plugin-src/com/todoroo/astrid/alarms/Alarm.java @@ -1,111 +1,34 @@ -/** - * See the file "LICENSE" for the full license governing this code. - */ package com.todoroo.astrid.alarms; - -import android.content.ContentValues; - -import com.todoroo.andlib.data.AbstractModel; -import com.todoroo.andlib.data.Property; import com.todoroo.andlib.data.Property.IntegerProperty; 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.astrid.model.Task; +import com.todoroo.astrid.model.Metadata; /** - * Data Model which represents an alarm + * Metadata entry for a task alarm * * @author Tim Su * */ -@SuppressWarnings("nls") -public class Alarm extends AbstractModel { - - // --- table - - public static final Table TABLE = new Table("alarm", Alarm.class); +public class Alarm { - // --- properties + /** metadata key */ + public static final String METADATA_KEY = "alarm"; //$NON-NLS-1$ - /** ID */ - public static final LongProperty ID = new LongProperty( - TABLE, ID_PROPERTY_NAME); + /** time of alarm */ + public static final LongProperty TIME = new LongProperty(Metadata.TABLE, + Metadata.VALUE1.name); - /** Associated Task */ - public static final LongProperty TASK = new LongProperty( - TABLE, "task"); - - /** Alarm Time */ - public static final LongProperty TIME = new LongProperty( - TABLE, "time"); - - /** Alarm Type (see constants) */ - public static final IntegerProperty TYPE = new IntegerProperty( - TABLE, "type"); - - /** Alarm Ringtone */ - public static final StringProperty RINGTONE = new StringProperty( - TABLE, "ringtone"); - - /** List of all properties for this model */ - public static final Property[] PROPERTIES = generateProperties(Alarm.class); + /** alarm type */ + public static final IntegerProperty TYPE = new IntegerProperty(Metadata.TABLE, + Metadata.VALUE2.name); // --- constants - /** this alarm was already triggered */ - public static final int TYPE_TRIGGERED = 0; - /** this alarm is single-shot */ public static final int TYPE_SINGLE = 1; /** this alarm repeats itself until turned off */ public static final int TYPE_REPEATING = 2; - // --- defaults - - /** Default values container */ - private static final ContentValues defaultValues = new ContentValues(); - - static { - defaultValues.put(TYPE.name, TYPE_SINGLE); - defaultValues.put(RINGTONE.name, ""); - } - - @Override - public ContentValues getDefaultValues() { - return defaultValues; - } - - // --- data access boilerplate - - public Alarm() { - super(); - } - - public Alarm(TodorooCursor cursor) { - this(); - readPropertiesFromCursor(cursor); - } - - public void readFromCursor(TodorooCursor cursor) { - super.readPropertiesFromCursor(cursor); - } - - @Override - public long getId() { - return getIdHelper(ID); - }; - - // --- parcelable helpers - - private static final Creator CREATOR = new ModelCreator(Task.class); - - @Override - protected Creator getCreator() { - return CREATOR; - } - } diff --git a/astrid/plugin-src/com/todoroo/astrid/alarms/AlarmControlSet.java b/astrid/plugin-src/com/todoroo/astrid/alarms/AlarmControlSet.java new file mode 100644 index 000000000..b9c54eb82 --- /dev/null +++ b/astrid/plugin-src/com/todoroo/astrid/alarms/AlarmControlSet.java @@ -0,0 +1,101 @@ +package com.todoroo.astrid.alarms; + +import java.util.Date; +import java.util.LinkedHashSet; + +import android.app.Activity; +import android.view.LayoutInflater; +import android.view.View; +import android.view.ViewGroup; +import android.widget.Button; +import android.widget.ImageButton; +import android.widget.LinearLayout; + +import com.timsu.astrid.R; +import com.todoroo.andlib.data.TodorooCursor; +import com.todoroo.andlib.widget.DateControlSet; +import com.todoroo.astrid.activity.TaskEditActivity.TaskEditControlSet; +import com.todoroo.astrid.model.Metadata; +import com.todoroo.astrid.model.Task; + +/** + * Control set to manage adding and removing tags + * + * @author Tim Su + * + */ +public final class AlarmControlSet implements TaskEditControlSet { + + // --- constants + + /** Number of alarms a task can have */ + static final int MAX_ALARMS = 10; + + // --- instance variables + + private final LinearLayout alertsContainer; + private final Activity activity; + + public AlarmControlSet(Activity activity, ViewGroup parent) { + View v = LayoutInflater.from(activity).inflate(R.layout.alarm_control, parent, true); + + this.activity = activity; + this.alertsContainer = (LinearLayout) v.findViewById(R.id.alert_container); + v.findViewById(R.id.alarms_add).setOnClickListener(new View.OnClickListener() { + @Override + public void onClick(View arg0) { + addAlarm(new Date()); + } + }); + } + + @Override + public void readFromTask(Task task) { + if(alertsContainer.getChildCount() == 0) { + TodorooCursor cursor = AlarmService.getInstance().getAlarms(task.getId()); + try { + for(cursor.moveToFirst(); !cursor.isAfterLast(); cursor.moveToNext()) + addAlarm(new Date(cursor.get(Alarm.TIME))); + } finally { + cursor.close(); + } + } + } + + @Override + public void writeToModel(Task task) { + LinkedHashSet alarms = new LinkedHashSet(); + for(int i = 0; i < alertsContainer.getChildCount(); i++) { + DateControlSet set = (DateControlSet) alertsContainer.getChildAt(i).getTag(); + if(set == null) + continue; + Date date = set.getDate(); + if(date != null) + alarms.add(set.getDate().getTime()); + } + AlarmService.getInstance().synchronizeAlarms(task.getId(), alarms); + } + + private boolean addAlarm(Date alert) { + if(alertsContainer.getChildCount() >= MAX_ALARMS) + return false; + + final View alertItem = LayoutInflater.from(activity).inflate(R.layout.alarm_edit_row, null); + alertsContainer.addView(alertItem); + + DateControlSet dcs = new DateControlSet(activity, (Button)alertItem.findViewById(R.id.date), + (Button)alertItem.findViewById(R.id.time)); + dcs.setDate(alert); + alertItem.setTag(dcs); + + ImageButton reminderRemoveButton; + reminderRemoveButton = (ImageButton)alertItem.findViewById(R.id.button1); + reminderRemoveButton.setOnClickListener(new View.OnClickListener() { + public void onClick(View v) { + alertsContainer.removeView(alertItem); + } + }); + + return true; + } +} \ No newline at end of file diff --git a/astrid/plugin-src/com/todoroo/astrid/alarms/AlarmDatabase.java b/astrid/plugin-src/com/todoroo/astrid/alarms/AlarmDatabase.java index 624eadc65..7e5c4d7f8 100644 --- a/astrid/plugin-src/com/todoroo/astrid/alarms/AlarmDatabase.java +++ b/astrid/plugin-src/com/todoroo/astrid/alarms/AlarmDatabase.java @@ -36,12 +36,12 @@ public class AlarmDatabase extends AbstractDatabase { * also make sure that our SQLite helper does the right thing. */ public static final Table[] TABLES = new Table[] { - Alarm.TABLE + TransitionalAlarm.TABLE }; // --- implementation - private final GenericDao dao = new GenericDao(Alarm.class, this); + private final GenericDao dao = new GenericDao(TransitionalAlarm.class, this); @Override protected String getName() { @@ -58,7 +58,7 @@ public class AlarmDatabase extends AbstractDatabase { return TABLES; } - public GenericDao getDao() { + public GenericDao getDao() { return dao; } @@ -66,15 +66,8 @@ public class AlarmDatabase extends AbstractDatabase { protected synchronized void onCreateTables() { StringBuilder sql = new StringBuilder(); sql.append("CREATE INDEX IF NOT EXISTS a_task ON "). - append(Alarm.TABLE).append('('). - append(Alarm.TASK.name). - append(')'); - database.execSQL(sql.toString()); - - sql.setLength(0); - sql.append("CREATE INDEX IF NOT EXISTS a_type ON "). - append(Alarm.TABLE).append('('). - append(Alarm.TYPE.name). + append(TransitionalAlarm.TABLE).append('('). + append(TransitionalAlarm.TASK.name). append(')'); database.execSQL(sql.toString()); } diff --git a/astrid/plugin-src/com/todoroo/astrid/alarms/AlarmService.java b/astrid/plugin-src/com/todoroo/astrid/alarms/AlarmService.java index c90c13cf2..6ae73b15e 100644 --- a/astrid/plugin-src/com/todoroo/astrid/alarms/AlarmService.java +++ b/astrid/plugin-src/com/todoroo/astrid/alarms/AlarmService.java @@ -1,11 +1,15 @@ package com.todoroo.astrid.alarms; -import java.util.ArrayList; +import java.util.LinkedHashSet; -import com.todoroo.andlib.data.GenericDao; import com.todoroo.andlib.data.TodorooCursor; -import com.todoroo.andlib.service.DependencyInjectionService; +import com.todoroo.andlib.sql.Criterion; +import com.todoroo.andlib.sql.Order; import com.todoroo.andlib.sql.Query; +import com.todoroo.astrid.core.PluginServices; +import com.todoroo.astrid.dao.MetadataDao.MetadataCriteria; +import com.todoroo.astrid.model.Metadata; +import com.todoroo.astrid.service.MetadataService; /** * Provides operations for working with alerts @@ -16,29 +20,27 @@ import com.todoroo.andlib.sql.Query; @SuppressWarnings("nls") public class AlarmService { - AlarmDatabase database = new AlarmDatabase(); + // --- singleton - GenericDao dao = new GenericDao(Alarm.class, database); + private static AlarmService instance = null; - /** - * Metadata key for # of alarms - */ - public static final String ALARM_COUNT = "alarms-count"; - - public AlarmService() { - DependencyInjectionService.getInstance().inject(this); + public static synchronized AlarmService getInstance() { + if(instance == null) + instance = new AlarmService(); + return instance; } + // --- interface /** - * Return alarms for the given task + * Return alarms for the given task. PLEASE CLOSE THE CURSOR! * * @param taskId */ - public TodorooCursor getAlarms(long taskId) { - database.openForReading(); - Query query = Query.select(Alarm.PROPERTIES).where(Alarm.TASK.eq(taskId)); - return dao.query(query); + public TodorooCursor getAlarms(long taskId) { + return PluginServices.getMetadataService().query(Query.select( + Metadata.PROPERTIES).where(MetadataCriteria.byTaskAndwithKey( + taskId, Alarm.METADATA_KEY)).orderBy(Order.asc(Alarm.TIME))); } /** @@ -46,14 +48,19 @@ public class AlarmService { * @param taskId * @param tags */ - public void synchronizeAlarms(long taskId, ArrayList alarms) { - database.openForWriting(); - dao.deleteWhere(Alarm.TASK.eq(taskId)); - - for(Alarm alarm : alarms) { - alarm.setId(Alarm.NO_ID); - alarm.setValue(Alarm.TASK, taskId); - dao.saveExisting(alarm); + public void synchronizeAlarms(long taskId, LinkedHashSet alarms) { + MetadataService service = PluginServices.getMetadataService(); + service.deleteWhere(Criterion.and(MetadataCriteria.byTask(taskId), + MetadataCriteria.withKey(Alarm.METADATA_KEY))); + + Metadata metadata = new Metadata(); + metadata.setValue(Metadata.KEY, Alarm.METADATA_KEY); + metadata.setValue(Metadata.TASK, taskId); + for(Long alarm : alarms) { + metadata.clearValue(Metadata.ID); + metadata.setValue(Alarm.TIME, alarm); + metadata.setValue(Alarm.TYPE, Alarm.TYPE_SINGLE); + service.save(metadata); } } } diff --git a/astrid/plugin-src/com/todoroo/astrid/alarms/TransitionalAlarm.java b/astrid/plugin-src/com/todoroo/astrid/alarms/TransitionalAlarm.java new file mode 100644 index 000000000..d8a93b9cc --- /dev/null +++ b/astrid/plugin-src/com/todoroo/astrid/alarms/TransitionalAlarm.java @@ -0,0 +1,102 @@ +/** + * See the file "LICENSE" for the full license governing this code. + */ +package com.todoroo.astrid.alarms; + + +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.Table; +import com.todoroo.andlib.data.TodorooCursor; +import com.todoroo.astrid.model.Task; + +/** + * Data Model which represents an alarm. This is a transitional class - + * Alarms are moved over to metadata + * + * @author Tim Su + * + */ +@SuppressWarnings("nls") +@Deprecated +public class TransitionalAlarm extends AbstractModel { + + // --- table + + public static final Table TABLE = new Table("alarm", TransitionalAlarm.class); + + // --- properties + + /** ID */ + public static final LongProperty ID = new LongProperty( + TABLE, ID_PROPERTY_NAME); + + /** Associated Task */ + public static final LongProperty TASK = new LongProperty( + TABLE, "task"); + + /** Alarm Time */ + public static final LongProperty TIME = new LongProperty( + TABLE, "time"); + + /** List of all properties for this model */ + public static final Property[] PROPERTIES = generateProperties(TransitionalAlarm.class); + + // --- constants + + /** this alarm was already triggered */ + public static final int TYPE_TRIGGERED = 0; + + /** this alarm is single-shot */ + public static final int TYPE_SINGLE = 1; + + /** this alarm repeats itself until turned off */ + public static final int TYPE_REPEATING = 2; + + // --- defaults + + /** Default values container */ + private static final ContentValues defaultValues = new ContentValues(); + + static { + // + } + + @Override + public ContentValues getDefaultValues() { + return defaultValues; + } + + // --- data access boilerplate + + public TransitionalAlarm() { + super(); + } + + public TransitionalAlarm(TodorooCursor cursor) { + this(); + readPropertiesFromCursor(cursor); + } + + public void readFromCursor(TodorooCursor cursor) { + super.readPropertiesFromCursor(cursor); + } + + @Override + public long getId() { + return getIdHelper(ID); + }; + + // --- parcelable helpers + + private static final Creator CREATOR = new ModelCreator(Task.class); + + @Override + protected Creator getCreator() { + return CREATOR; + } + +} diff --git a/astrid/plugin-src/com/todoroo/astrid/backup/TasksXmlImporter.java b/astrid/plugin-src/com/todoroo/astrid/backup/TasksXmlImporter.java index 4f17af28c..dc9839dce 100644 --- a/astrid/plugin-src/com/todoroo/astrid/backup/TasksXmlImporter.java +++ b/astrid/plugin-src/com/todoroo/astrid/backup/TasksXmlImporter.java @@ -2,8 +2,8 @@ package com.todoroo.astrid.backup; import java.io.FileReader; import java.io.IOException; -import java.util.ArrayList; import java.util.Date; +import java.util.LinkedHashSet; import java.util.StringTokenizer; import org.xmlpull.v1.XmlPullParser; @@ -329,7 +329,7 @@ public class TasksXmlImporter { private String upgradeNotes = null; private boolean syncOnComplete = false; - private final ArrayList tags = new ArrayList(); + private final LinkedHashSet tags = new LinkedHashSet(); public Format1TaskImporter(XmlPullParser xpp) throws XmlPullParserException, IOException { this.xpp = xpp; diff --git a/astrid/plugin-src/com/todoroo/astrid/tags/TagFilterExposer.java b/astrid/plugin-src/com/todoroo/astrid/tags/TagFilterExposer.java index 86bbecada..b8251c340 100644 --- a/astrid/plugin-src/com/todoroo/astrid/tags/TagFilterExposer.java +++ b/astrid/plugin-src/com/todoroo/astrid/tags/TagFilterExposer.java @@ -11,12 +11,14 @@ import android.content.res.Resources; import android.graphics.drawable.BitmapDrawable; import com.timsu.astrid.R; +import com.todoroo.andlib.sql.Criterion; import com.todoroo.andlib.sql.QueryTemplate; import com.todoroo.astrid.api.AstridApiConstants; 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.dao.TaskDao.TaskCriteria; import com.todoroo.astrid.model.Metadata; import com.todoroo.astrid.tags.TagService.Tag; @@ -59,7 +61,7 @@ public class TagFilterExposer extends BroadcastReceiver { @Override public void onReceive(Context context, Intent intent) { tagService = TagService.getInstance(); - Tag[] tagsByAlpha = tagService.getGroupedTags(TagService.GROUPED_TAGS_BY_ALPHA); + Tag[] tagsByAlpha = tagService.getGroupedTags(TagService.GROUPED_TAGS_BY_ALPHA, Criterion.all); // If user does not have any tags, don't show this section at all if(tagsByAlpha.length == 0) @@ -67,7 +69,7 @@ public class TagFilterExposer extends BroadcastReceiver { Resources r = context.getResources(); - Tag[] tagsBySize = tagService.getGroupedTags(TagService.GROUPED_TAGS_BY_SIZE); + Tag[] tagsBySize = tagService.getGroupedTags(TagService.GROUPED_TAGS_BY_SIZE, TaskCriteria.isActive()); Filter[] filtersByAlpha = new Filter[tagsByAlpha.length]; for(int i = 0; i < tagsByAlpha.length; i++) filtersByAlpha[i] = filterFromTag(context, tagsByAlpha[i], false); @@ -76,7 +78,7 @@ public class TagFilterExposer extends BroadcastReceiver { for(int i = 0; i < tagsBySize.length; i++) filtersBySize[i] = filterFromTag(context, tagsBySize[i], false); - Tag[] completed = tagService.getGroupedTags(TagService.GROUPED_TAGS_COMPLETED); + Tag[] completed = tagService.getGroupedTags(TagService.GROUPED_TAGS_BY_SIZE, TaskCriteria.completed()); Filter[] filtersCompleted = new Filter[completed.length]; for(int i = 0; i < completed.length; i++) filtersCompleted[i] = filterFromTag(context, completed[i], true); diff --git a/astrid/plugin-src/com/todoroo/astrid/tags/TagService.java b/astrid/plugin-src/com/todoroo/astrid/tags/TagService.java index 09499248a..2e9fde24e 100644 --- a/astrid/plugin-src/com/todoroo/astrid/tags/TagService.java +++ b/astrid/plugin-src/com/todoroo/astrid/tags/TagService.java @@ -1,6 +1,6 @@ package com.todoroo.astrid.tags; -import java.util.ArrayList; +import java.util.LinkedHashSet; import com.todoroo.andlib.data.Property.CountProperty; import com.todoroo.andlib.data.Property.StringProperty; @@ -58,12 +58,8 @@ public final class TagService { * Property for retrieving count of aggregated rows */ private static final CountProperty COUNT = new CountProperty(); - public static final QueryTemplate GROUPED_TAGS_BY_ALPHA = new QueryTemplate().where(Criterion.and(TaskCriteria.isActive(), MetadataCriteria.withKey(KEY))). - orderBy(Order.asc(TAG)); - public static final QueryTemplate GROUPED_TAGS_BY_SIZE = new QueryTemplate().where(Criterion.and(TaskCriteria.isActive(), MetadataCriteria.withKey(KEY))). - orderBy(Order.desc(COUNT)); - public static final QueryTemplate GROUPED_TAGS_COMPLETED = new QueryTemplate().where(Criterion.and(TaskCriteria.completed(), MetadataCriteria.withKey(KEY))). - orderBy(Order.desc(COUNT)); + public static final Order GROUPED_TAGS_BY_ALPHA = Order.asc(TAG); + public static final Order GROUPED_TAGS_BY_SIZE = Order.desc(COUNT); /** * Helper class for returning a tag/task count pair @@ -105,13 +101,15 @@ public final class TagService { /** * Return all tags ordered by given clause * - * @param taskId + * @param order ordering + * @param activeStatus criterion for specifying completed or uncompleted * @return empty array if no tags, otherwise array */ - public Tag[] getGroupedTags(QueryTemplate template) { + public Tag[] getGroupedTags(Order order, Criterion activeStatus) { Query query = Query.select(TAG.as(TAG.name), COUNT). join(Join.inner(Task.TABLE, Metadata.TASK.eq(Task.ID))). - withQueryTemplate(template.toString()).groupBy(TAG); + where(Criterion.and(activeStatus, MetadataCriteria.withKey(KEY))). + orderBy(order).groupBy(TAG); TodorooCursor cursor = metadataDao.query(query); try { Tag[] array = new Tag[cursor.getCount()]; @@ -179,7 +177,7 @@ public final class TagService { * @param taskId * @param tags */ - public void synchronizeTags(long taskId, ArrayList tags) { + public void synchronizeTags(long taskId, LinkedHashSet tags) { metadataDao.deleteWhere(Criterion.and(MetadataCriteria.byTask(taskId), MetadataCriteria.withKey(KEY))); diff --git a/astrid/plugin-src/com/todoroo/astrid/tags/TagsControlSet.java b/astrid/plugin-src/com/todoroo/astrid/tags/TagsControlSet.java index 0081a545a..469b6c03d 100644 --- a/astrid/plugin-src/com/todoroo/astrid/tags/TagsControlSet.java +++ b/astrid/plugin-src/com/todoroo/astrid/tags/TagsControlSet.java @@ -1,6 +1,6 @@ package com.todoroo.astrid.tags; -import java.util.ArrayList; +import java.util.LinkedHashSet; import android.app.Activity; import android.text.Editable; @@ -15,6 +15,7 @@ import android.widget.TextView; import com.timsu.astrid.R; import com.todoroo.andlib.data.TodorooCursor; +import com.todoroo.andlib.sql.Criterion; import com.todoroo.astrid.activity.TaskEditActivity.TaskEditControlSet; import com.todoroo.astrid.model.Metadata; import com.todoroo.astrid.model.Task; @@ -41,7 +42,7 @@ public final class TagsControlSet implements TaskEditControlSet { private final Activity activity; public TagsControlSet(Activity activity, int tagsContainer) { - allTags = tagService.getGroupedTags(TagService.GROUPED_TAGS_BY_SIZE); + allTags = tagService.getGroupedTags(TagService.GROUPED_TAGS_BY_SIZE, Criterion.all); this.activity = activity; this.tagsContainer = (LinearLayout) activity.findViewById(tagsContainer); } @@ -64,7 +65,7 @@ public final class TagsControlSet implements TaskEditControlSet { @Override public void writeToModel(Task task) { - ArrayList tags = new ArrayList(); + LinkedHashSet tags = new LinkedHashSet(); for(int i = 0; i < tagsContainer.getChildCount(); i++) { TextView tagName = (TextView)tagsContainer.getChildAt(i).findViewById(R.id.text1); diff --git a/astrid/res/layout/alarm_control.xml b/astrid/res/layout/alarm_control.xml new file mode 100644 index 000000000..ba11307fc --- /dev/null +++ b/astrid/res/layout/alarm_control.xml @@ -0,0 +1,23 @@ + + + + + + + + + +