Completed step 1 of alarms - the control set

pull/14/head
Tim Su 16 years ago
parent feb6b828a5
commit 8fee29ef55

@ -89,14 +89,14 @@ public final class Query {
visitSelectClause(sql); visitSelectClause(sql);
visitFromClause(sql); visitFromClause(sql);
visitJoinClause(sql);
if(queryTemplate == null) { if(queryTemplate == null) {
visitJoinClause(sql);
visitWhereClause(sql); visitWhereClause(sql);
visitGroupByClause(sql); visitGroupByClause(sql);
visitOrderByClause(sql); visitOrderByClause(sql);
visitLimitClause(sql); visitLimitClause(sql);
} else { } else {
if(joins.size() > 0 || groupBies.size() > 0 || orders.size() > 0 || if(groupBies.size() > 0 || orders.size() > 0 ||
havings.size() > 0) havings.size() > 0)
throw new IllegalStateException("Can't have extras AND query template"); //$NON-NLS-1$ throw new IllegalStateException("Can't have extras AND query template"); //$NON-NLS-1$
sql.append(queryTemplate); sql.append(queryTemplate);

@ -1,111 +1,34 @@
/**
* See the file "LICENSE" for the full license governing this code.
*/
package com.todoroo.astrid.alarms; 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.IntegerProperty;
import com.todoroo.andlib.data.Property.LongProperty; import com.todoroo.andlib.data.Property.LongProperty;
import com.todoroo.andlib.data.Property.StringProperty; import com.todoroo.astrid.model.Metadata;
import com.todoroo.andlib.data.Table;
import com.todoroo.andlib.data.TodorooCursor;
import com.todoroo.astrid.model.Task;
/** /**
* Data Model which represents an alarm * Metadata entry for a task alarm
* *
* @author Tim Su <tim@todoroo.com> * @author Tim Su <tim@todoroo.com>
* *
*/ */
@SuppressWarnings("nls") public class Alarm {
public class Alarm extends AbstractModel {
// --- table
public static final Table TABLE = new Table("alarm", Alarm.class);
// --- properties /** metadata key */
public static final String METADATA_KEY = "alarm"; //$NON-NLS-1$
/** ID */ /** time of alarm */
public static final LongProperty ID = new LongProperty( public static final LongProperty TIME = new LongProperty(Metadata.TABLE,
TABLE, ID_PROPERTY_NAME); Metadata.VALUE1.name);
/** Associated Task */ /** alarm type */
public static final LongProperty TASK = new LongProperty( public static final IntegerProperty TYPE = new IntegerProperty(Metadata.TABLE,
TABLE, "task"); Metadata.VALUE2.name);
/** 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);
// --- constants // --- constants
/** this alarm was already triggered */
public static final int TYPE_TRIGGERED = 0;
/** this alarm is single-shot */ /** this alarm is single-shot */
public static final int TYPE_SINGLE = 1; public static final int TYPE_SINGLE = 1;
/** this alarm repeats itself until turned off */ /** this alarm repeats itself until turned off */
public static final int TYPE_REPEATING = 2; 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<Alarm> cursor) {
this();
readPropertiesFromCursor(cursor);
}
public void readFromCursor(TodorooCursor<Alarm> cursor) {
super.readPropertiesFromCursor(cursor);
}
@Override
public long getId() {
return getIdHelper(ID);
};
// --- parcelable helpers
private static final Creator<Task> CREATOR = new ModelCreator<Task>(Task.class);
@Override
protected Creator<? extends AbstractModel> getCreator() {
return CREATOR;
}
} }

@ -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 <tim@todoroo.com>
*
*/
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<Metadata> 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<Long> alarms = new LinkedHashSet<Long>();
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;
}
}

@ -36,12 +36,12 @@ public class AlarmDatabase extends AbstractDatabase {
* also make sure that our SQLite helper does the right thing. * also make sure that our SQLite helper does the right thing.
*/ */
public static final Table[] TABLES = new Table[] { public static final Table[] TABLES = new Table[] {
Alarm.TABLE TransitionalAlarm.TABLE
}; };
// --- implementation // --- implementation
private final GenericDao<Alarm> dao = new GenericDao<Alarm>(Alarm.class, this); private final GenericDao<TransitionalAlarm> dao = new GenericDao<TransitionalAlarm>(TransitionalAlarm.class, this);
@Override @Override
protected String getName() { protected String getName() {
@ -58,7 +58,7 @@ public class AlarmDatabase extends AbstractDatabase {
return TABLES; return TABLES;
} }
public GenericDao<Alarm> getDao() { public GenericDao<TransitionalAlarm> getDao() {
return dao; return dao;
} }
@ -66,15 +66,8 @@ public class AlarmDatabase extends AbstractDatabase {
protected synchronized void onCreateTables() { protected synchronized void onCreateTables() {
StringBuilder sql = new StringBuilder(); StringBuilder sql = new StringBuilder();
sql.append("CREATE INDEX IF NOT EXISTS a_task ON "). sql.append("CREATE INDEX IF NOT EXISTS a_task ON ").
append(Alarm.TABLE).append('('). append(TransitionalAlarm.TABLE).append('(').
append(Alarm.TASK.name). append(TransitionalAlarm.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(')'); append(')');
database.execSQL(sql.toString()); database.execSQL(sql.toString());
} }

@ -1,11 +1,15 @@
package com.todoroo.astrid.alarms; 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.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.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 * Provides operations for working with alerts
@ -16,29 +20,27 @@ import com.todoroo.andlib.sql.Query;
@SuppressWarnings("nls") @SuppressWarnings("nls")
public class AlarmService { public class AlarmService {
AlarmDatabase database = new AlarmDatabase(); // --- singleton
GenericDao<Alarm> dao = new GenericDao<Alarm>(Alarm.class, database); private static AlarmService instance = null;
/** public static synchronized AlarmService getInstance() {
* Metadata key for # of alarms if(instance == null)
*/ instance = new AlarmService();
public static final String ALARM_COUNT = "alarms-count"; return instance;
public AlarmService() {
DependencyInjectionService.getInstance().inject(this);
} }
// --- interface
/** /**
* Return alarms for the given task * Return alarms for the given task. PLEASE CLOSE THE CURSOR!
* *
* @param taskId * @param taskId
*/ */
public TodorooCursor<Alarm> getAlarms(long taskId) { public TodorooCursor<Metadata> getAlarms(long taskId) {
database.openForReading(); return PluginServices.getMetadataService().query(Query.select(
Query query = Query.select(Alarm.PROPERTIES).where(Alarm.TASK.eq(taskId)); Metadata.PROPERTIES).where(MetadataCriteria.byTaskAndwithKey(
return dao.query(query); taskId, Alarm.METADATA_KEY)).orderBy(Order.asc(Alarm.TIME)));
} }
/** /**
@ -46,14 +48,19 @@ public class AlarmService {
* @param taskId * @param taskId
* @param tags * @param tags
*/ */
public void synchronizeAlarms(long taskId, ArrayList<Alarm> alarms) { public void synchronizeAlarms(long taskId, LinkedHashSet<Long> alarms) {
database.openForWriting(); MetadataService service = PluginServices.getMetadataService();
dao.deleteWhere(Alarm.TASK.eq(taskId)); service.deleteWhere(Criterion.and(MetadataCriteria.byTask(taskId),
MetadataCriteria.withKey(Alarm.METADATA_KEY)));
for(Alarm alarm : alarms) {
alarm.setId(Alarm.NO_ID); Metadata metadata = new Metadata();
alarm.setValue(Alarm.TASK, taskId); metadata.setValue(Metadata.KEY, Alarm.METADATA_KEY);
dao.saveExisting(alarm); 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);
} }
} }
} }

@ -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 <tim@todoroo.com>
*
*/
@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<TransitionalAlarm> cursor) {
this();
readPropertiesFromCursor(cursor);
}
public void readFromCursor(TodorooCursor<TransitionalAlarm> cursor) {
super.readPropertiesFromCursor(cursor);
}
@Override
public long getId() {
return getIdHelper(ID);
};
// --- parcelable helpers
private static final Creator<Task> CREATOR = new ModelCreator<Task>(Task.class);
@Override
protected Creator<? extends AbstractModel> getCreator() {
return CREATOR;
}
}

@ -2,8 +2,8 @@ package com.todoroo.astrid.backup;
import java.io.FileReader; import java.io.FileReader;
import java.io.IOException; import java.io.IOException;
import java.util.ArrayList;
import java.util.Date; import java.util.Date;
import java.util.LinkedHashSet;
import java.util.StringTokenizer; import java.util.StringTokenizer;
import org.xmlpull.v1.XmlPullParser; import org.xmlpull.v1.XmlPullParser;
@ -329,7 +329,7 @@ public class TasksXmlImporter {
private String upgradeNotes = null; private String upgradeNotes = null;
private boolean syncOnComplete = false; private boolean syncOnComplete = false;
private final ArrayList<String> tags = new ArrayList<String>(); private final LinkedHashSet<String> tags = new LinkedHashSet<String>();
public Format1TaskImporter(XmlPullParser xpp) throws XmlPullParserException, IOException { public Format1TaskImporter(XmlPullParser xpp) throws XmlPullParserException, IOException {
this.xpp = xpp; this.xpp = xpp;

@ -11,12 +11,14 @@ import android.content.res.Resources;
import android.graphics.drawable.BitmapDrawable; import android.graphics.drawable.BitmapDrawable;
import com.timsu.astrid.R; import com.timsu.astrid.R;
import com.todoroo.andlib.sql.Criterion;
import com.todoroo.andlib.sql.QueryTemplate; import com.todoroo.andlib.sql.QueryTemplate;
import com.todoroo.astrid.api.AstridApiConstants; import com.todoroo.astrid.api.AstridApiConstants;
import com.todoroo.astrid.api.Filter; import com.todoroo.astrid.api.Filter;
import com.todoroo.astrid.api.FilterCategory; import com.todoroo.astrid.api.FilterCategory;
import com.todoroo.astrid.api.FilterListHeader; import com.todoroo.astrid.api.FilterListHeader;
import com.todoroo.astrid.api.FilterListItem; import com.todoroo.astrid.api.FilterListItem;
import com.todoroo.astrid.dao.TaskDao.TaskCriteria;
import com.todoroo.astrid.model.Metadata; import com.todoroo.astrid.model.Metadata;
import com.todoroo.astrid.tags.TagService.Tag; import com.todoroo.astrid.tags.TagService.Tag;
@ -59,7 +61,7 @@ public class TagFilterExposer extends BroadcastReceiver {
@Override @Override
public void onReceive(Context context, Intent intent) { public void onReceive(Context context, Intent intent) {
tagService = TagService.getInstance(); 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 user does not have any tags, don't show this section at all
if(tagsByAlpha.length == 0) if(tagsByAlpha.length == 0)
@ -67,7 +69,7 @@ public class TagFilterExposer extends BroadcastReceiver {
Resources r = context.getResources(); 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]; Filter[] filtersByAlpha = new Filter[tagsByAlpha.length];
for(int i = 0; i < tagsByAlpha.length; i++) for(int i = 0; i < tagsByAlpha.length; i++)
filtersByAlpha[i] = filterFromTag(context, tagsByAlpha[i], false); filtersByAlpha[i] = filterFromTag(context, tagsByAlpha[i], false);
@ -76,7 +78,7 @@ public class TagFilterExposer extends BroadcastReceiver {
for(int i = 0; i < tagsBySize.length; i++) for(int i = 0; i < tagsBySize.length; i++)
filtersBySize[i] = filterFromTag(context, tagsBySize[i], false); 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]; Filter[] filtersCompleted = new Filter[completed.length];
for(int i = 0; i < completed.length; i++) for(int i = 0; i < completed.length; i++)
filtersCompleted[i] = filterFromTag(context, completed[i], true); filtersCompleted[i] = filterFromTag(context, completed[i], true);

@ -1,6 +1,6 @@
package com.todoroo.astrid.tags; 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.CountProperty;
import com.todoroo.andlib.data.Property.StringProperty; import com.todoroo.andlib.data.Property.StringProperty;
@ -58,12 +58,8 @@ public final class TagService {
* Property for retrieving count of aggregated rows * Property for retrieving count of aggregated rows
*/ */
private static final CountProperty COUNT = new CountProperty(); 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))). public static final Order GROUPED_TAGS_BY_ALPHA = Order.asc(TAG);
orderBy(Order.asc(TAG)); public static final Order GROUPED_TAGS_BY_SIZE = Order.desc(COUNT);
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));
/** /**
* Helper class for returning a tag/task count pair * Helper class for returning a tag/task count pair
@ -105,13 +101,15 @@ public final class TagService {
/** /**
* Return all tags ordered by given clause * 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 * @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). Query query = Query.select(TAG.as(TAG.name), COUNT).
join(Join.inner(Task.TABLE, Metadata.TASK.eq(Task.ID))). 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<Metadata> cursor = metadataDao.query(query); TodorooCursor<Metadata> cursor = metadataDao.query(query);
try { try {
Tag[] array = new Tag[cursor.getCount()]; Tag[] array = new Tag[cursor.getCount()];
@ -179,7 +177,7 @@ public final class TagService {
* @param taskId * @param taskId
* @param tags * @param tags
*/ */
public void synchronizeTags(long taskId, ArrayList<String> tags) { public void synchronizeTags(long taskId, LinkedHashSet<String> tags) {
metadataDao.deleteWhere(Criterion.and(MetadataCriteria.byTask(taskId), metadataDao.deleteWhere(Criterion.and(MetadataCriteria.byTask(taskId),
MetadataCriteria.withKey(KEY))); MetadataCriteria.withKey(KEY)));

@ -1,6 +1,6 @@
package com.todoroo.astrid.tags; package com.todoroo.astrid.tags;
import java.util.ArrayList; import java.util.LinkedHashSet;
import android.app.Activity; import android.app.Activity;
import android.text.Editable; import android.text.Editable;
@ -15,6 +15,7 @@ import android.widget.TextView;
import com.timsu.astrid.R; import com.timsu.astrid.R;
import com.todoroo.andlib.data.TodorooCursor; import com.todoroo.andlib.data.TodorooCursor;
import com.todoroo.andlib.sql.Criterion;
import com.todoroo.astrid.activity.TaskEditActivity.TaskEditControlSet; import com.todoroo.astrid.activity.TaskEditActivity.TaskEditControlSet;
import com.todoroo.astrid.model.Metadata; import com.todoroo.astrid.model.Metadata;
import com.todoroo.astrid.model.Task; import com.todoroo.astrid.model.Task;
@ -41,7 +42,7 @@ public final class TagsControlSet implements TaskEditControlSet {
private final Activity activity; private final Activity activity;
public TagsControlSet(Activity activity, int tagsContainer) { 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.activity = activity;
this.tagsContainer = (LinearLayout) activity.findViewById(tagsContainer); this.tagsContainer = (LinearLayout) activity.findViewById(tagsContainer);
} }
@ -64,7 +65,7 @@ public final class TagsControlSet implements TaskEditControlSet {
@Override @Override
public void writeToModel(Task task) { public void writeToModel(Task task) {
ArrayList<String> tags = new ArrayList<String>(); LinkedHashSet<String> tags = new LinkedHashSet<String>();
for(int i = 0; i < tagsContainer.getChildCount(); i++) { for(int i = 0; i < tagsContainer.getChildCount(); i++) {
TextView tagName = (TextView)tagsContainer.getChildAt(i).findViewById(R.id.text1); TextView tagName = (TextView)tagsContainer.getChildAt(i).findViewById(R.id.text1);

@ -0,0 +1,23 @@
<?xml version="1.0" encoding="utf-8"?>
<!-- See the file "LICENSE" for the full license governing this code. -->
<merge xmlns:android="http://schemas.android.com/apk/res/android">
<TextView android:id="@+id/alarms_label"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="@string/alarm_ACS_label"
style="@style/TextAppearance.GEN_EditLabel" />
<LinearLayout android:id="@+id/alert_container"
android:orientation="vertical"
android:layout_width="fill_parent"
android:layout_height="wrap_content">
</LinearLayout>
<Button android:id="@+id/alarms_add"
android:text="@string/alarm_ACS_button"
android:layout_width="fill_parent"
android:layout_height="wrap_content"/>
</merge>

@ -0,0 +1,42 @@
<?xml version="1.0" encoding="utf-8"?>
<!-- Copyright (C) 2008 The Android Open Source Project
Licensed under the Apache License, Version 2.0 (the "License");
you may not use this file except in compliance with the License.
You may obtain a copy of the License at
http://www.apache.org/licenses/LICENSE-2.0
Unless required by applicable law or agreed to in writing, software
distributed under the License is distributed on an "AS IS" BASIS,
WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
See the License for the specific language governing permissions and
limitations under the License.
-->
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:orientation="horizontal"
android:layout_width="fill_parent"
android:layout_height="wrap_content">
<Button android:id="@+id/date"
android:layout_weight="0.7"
android:layout_width="wrap_content"
android:layout_height="wrap_content"/>
<Button android:id="@+id/time"
android:layout_weight="1"
android:layout_width="wrap_content"
android:layout_height="wrap_content"/>
<ImageButton android:id="@+id/button1"
style="?android:attr/buttonStyleInset"
android:src="@android:drawable/ic_delete"
android:layout_width="wrap_content"
android:layout_height="fill_parent"
android:layout_marginTop="2dip"
android:layout_marginRight="2dip"
android:layout_marginBottom="2dip"
android:gravity="center_vertical"
/>
</LinearLayout>

@ -0,0 +1,16 @@
<?xml version="1.0" encoding="utf-8"?>
<!-- See the file "LICENSE" for the full license governing this code. -->
<resources xmlns:android="http://schemas.android.com/apk/res/android">
<!-- Resources for built-in timers plug-in -->
<!-- Task Edit Activity: Container Label -->
<string name="alarm_ACS_label">Alarms</string>
<!-- Task Edit Activity: Add New Alarn -->
<string name="alarm_ACS_button">Add an Alarm</string>
<!-- Android Notification Title (%s => task name) -->
<string name="alarm_notification">Alarm! %s</string>
</resources>

@ -27,15 +27,16 @@ import java.util.List;
import android.app.AlertDialog; import android.app.AlertDialog;
import android.app.DatePickerDialog; import android.app.DatePickerDialog;
import android.app.TabActivity;
import android.app.DatePickerDialog.OnDateSetListener; import android.app.DatePickerDialog.OnDateSetListener;
import android.app.TabActivity;
import android.content.BroadcastReceiver; import android.content.BroadcastReceiver;
import android.content.Context; import android.content.Context;
import android.content.DialogInterface; import android.content.DialogInterface;
import android.content.DialogInterface.OnCancelListener;
import android.content.Intent; import android.content.Intent;
import android.content.IntentFilter; import android.content.IntentFilter;
import android.content.DialogInterface.OnCancelListener;
import android.content.res.Resources; import android.content.res.Resources;
import android.graphics.Color;
import android.os.Bundle; import android.os.Bundle;
import android.view.LayoutInflater; import android.view.LayoutInflater;
import android.view.Menu; import android.view.Menu;
@ -44,6 +45,7 @@ import android.view.View;
import android.view.ViewGroup; import android.view.ViewGroup;
import android.view.ViewGroup.LayoutParams; import android.view.ViewGroup.LayoutParams;
import android.widget.AdapterView; import android.widget.AdapterView;
import android.widget.AdapterView.OnItemSelectedListener;
import android.widget.ArrayAdapter; import android.widget.ArrayAdapter;
import android.widget.Button; import android.widget.Button;
import android.widget.CheckBox; import android.widget.CheckBox;
@ -58,7 +60,6 @@ import android.widget.TabHost;
import android.widget.TimePicker; import android.widget.TimePicker;
import android.widget.Toast; import android.widget.Toast;
import android.widget.ToggleButton; import android.widget.ToggleButton;
import android.widget.AdapterView.OnItemSelectedListener;
import com.flurry.android.FlurryAgent; import com.flurry.android.FlurryAgent;
import com.timsu.astrid.R; import com.timsu.astrid.R;
@ -68,6 +69,7 @@ import com.todoroo.andlib.service.DependencyInjectionService;
import com.todoroo.andlib.service.ExceptionService; import com.todoroo.andlib.service.ExceptionService;
import com.todoroo.andlib.utility.AndroidUtilities; import com.todoroo.andlib.utility.AndroidUtilities;
import com.todoroo.andlib.utility.DateUtilities; import com.todoroo.andlib.utility.DateUtilities;
import com.todoroo.astrid.alarms.AlarmControlSet;
import com.todoroo.astrid.api.AstridApiConstants; import com.todoroo.astrid.api.AstridApiConstants;
import com.todoroo.astrid.dao.Database; import com.todoroo.astrid.dao.Database;
import com.todoroo.astrid.gcal.GCalControlSet; import com.todoroo.astrid.gcal.GCalControlSet;
@ -219,6 +221,8 @@ public final class TaskEditActivity extends TabActivity {
controls.add(new GCalControlSet(this, addonsAddons)); controls.add(new GCalControlSet(this, addonsAddons));
separator(addonsAddons); separator(addonsAddons);
controls.add(new TimerControlSet(this, addonsAddons)); controls.add(new TimerControlSet(this, addonsAddons));
separator(addonsAddons);
controls.add(new AlarmControlSet(this, addonsAddons));
} }
// show add-on help if necessary // show add-on help if necessary
@ -251,7 +255,7 @@ public final class TaskEditActivity extends TabActivity {
*/ */
private void separator(ViewGroup parent) { private void separator(ViewGroup parent) {
View view = new View(this); View view = new View(this);
view.setBackgroundResource(R.drawable.black_white_gradient); view.setBackgroundColor(Color.RED);
view.setPadding(2, 3, 2, 3); view.setPadding(2, 3, 2, 3);
parent.addView(view); parent.addView(view);
} }

@ -128,7 +128,8 @@ public class Astrid2TaskProvider extends ContentProvider {
*/ */
public Cursor getTags() { public Cursor getTags() {
Tag[] tags = TagService.getInstance().getGroupedTags(TagService.GROUPED_TAGS_BY_SIZE); Tag[] tags = TagService.getInstance().getGroupedTags(TagService.GROUPED_TAGS_BY_SIZE,
Criterion.all);
MatrixCursor ret = new MatrixCursor(TAGS_FIELD_LIST); MatrixCursor ret = new MatrixCursor(TAGS_FIELD_LIST);

@ -31,7 +31,7 @@ import com.todoroo.andlib.service.ExceptionService;
import com.todoroo.andlib.utility.DateUtilities; import com.todoroo.andlib.utility.DateUtilities;
import com.todoroo.andlib.utility.DialogUtilities; import com.todoroo.andlib.utility.DialogUtilities;
import com.todoroo.astrid.activity.TaskListActivity; import com.todoroo.astrid.activity.TaskListActivity;
import com.todoroo.astrid.alarms.Alarm; import com.todoroo.astrid.alarms.TransitionalAlarm;
import com.todoroo.astrid.alarms.AlarmDatabase; import com.todoroo.astrid.alarms.AlarmDatabase;
import com.todoroo.astrid.backup.TasksXmlImporter; import com.todoroo.astrid.backup.TasksXmlImporter;
import com.todoroo.astrid.dao.Database; import com.todoroo.astrid.dao.Database;
@ -177,10 +177,10 @@ public class Astrid2To3UpgradeHelper {
AlarmDatabase alarmsDatabase = new AlarmDatabase(); AlarmDatabase alarmsDatabase = new AlarmDatabase();
alarmsDatabase.openForWriting(); alarmsDatabase.openForWriting();
propertyMap.clear(); propertyMap.clear();
propertyMap.put("_id", Alarm.ID); //$NON-NLS-1$ propertyMap.put("_id", TransitionalAlarm.ID); //$NON-NLS-1$
propertyMap.put(LegacyAlertModel.TASK, Alarm.TASK); propertyMap.put(LegacyAlertModel.TASK, TransitionalAlarm.TASK);
propertyMap.put(LegacyAlertModel.DATE, Alarm.TIME); propertyMap.put(LegacyAlertModel.DATE, TransitionalAlarm.TIME);
upgradeTable(context, alertsTable, propertyMap, new Alarm(), upgradeTable(context, alertsTable, propertyMap, new TransitionalAlarm(),
alarmsDatabase.getDao()); alarmsDatabase.getDao());
alarmsDatabase.close(); alarmsDatabase.close();

@ -103,7 +103,7 @@ public class TasksWidget extends AppWidgetProvider {
database.openForReading(); database.openForReading();
cursor = taskService.fetchFiltered(inboxFilter, null, Task.TITLE, Task.DUE_DATE); cursor = taskService.fetchFiltered(inboxFilter, null, Task.TITLE, Task.DUE_DATE);
Task task = new Task(); Task task = new Task();
for (int i = 0; i < cursor.getCount(); i++) { for (int i = 0; i < cursor.getCount() && i < numberOfTasks; i++) {
cursor.moveToPosition(i); cursor.moveToPosition(i);
task.readFromCursor(cursor); task.readFromCursor(cursor);
@ -115,7 +115,7 @@ public class TasksWidget extends AppWidgetProvider {
textColor = context.getResources().getColor(R.color.task_list_overdue); textColor = context.getResources().getColor(R.color.task_list_overdue);
if(i > 0) if(i > 0)
views.setViewVisibility(separatorIDs[i-1], View.VISIBLE); views.setViewVisibility(separatorIDs[i-1], View.VISIBLE);
views.setTextViewText(textIDs[i], textContent); views.setTextViewText(textIDs[i], textContent);
views.setTextColor(textIDs[i], textColor); views.setTextColor(textIDs[i], textColor);
} }

@ -10,7 +10,7 @@ import com.todoroo.andlib.data.TodorooCursor;
import com.todoroo.andlib.service.Autowired; import com.todoroo.andlib.service.Autowired;
import com.todoroo.andlib.service.TestDependencyInjector; import com.todoroo.andlib.service.TestDependencyInjector;
import com.todoroo.andlib.sql.Query; import com.todoroo.andlib.sql.Query;
import com.todoroo.astrid.alarms.Alarm; import com.todoroo.astrid.alarms.TransitionalAlarm;
import com.todoroo.astrid.alarms.AlarmDatabase; import com.todoroo.astrid.alarms.AlarmDatabase;
import com.todoroo.astrid.dao.MetadataDao; import com.todoroo.astrid.dao.MetadataDao;
import com.todoroo.astrid.dao.TaskDao; import com.todoroo.astrid.dao.TaskDao;
@ -363,14 +363,14 @@ public class Astrid2To3UpgradeTests extends DatabaseTestCase {
database.openForReading(); database.openForReading();
alarmsDatabase.openForReading(); alarmsDatabase.openForReading();
TodorooCursor<Alarm> cursor = alarmsDatabase.getDao().query(Query.select(Alarm.TIME)); TodorooCursor<TransitionalAlarm> cursor = alarmsDatabase.getDao().query(Query.select(TransitionalAlarm.TIME));
assertEquals(2, cursor.getCount()); assertEquals(2, cursor.getCount());
cursor.moveToFirst(); cursor.moveToFirst();
Alarm alarm = new Alarm(cursor); TransitionalAlarm alarm = new TransitionalAlarm(cursor);
assertDatesEqual(x1, alarm.getValue(Alarm.TIME)); assertDatesEqual(x1, alarm.getValue(TransitionalAlarm.TIME));
cursor.moveToNext(); cursor.moveToNext();
alarm.readFromCursor(cursor); alarm.readFromCursor(cursor);
assertDatesEqual(x2, alarm.getValue(Alarm.TIME)); assertDatesEqual(x2, alarm.getValue(TransitionalAlarm.TIME));
} }
/** /**

Loading…
Cancel
Save