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);
visitFromClause(sql);
if(queryTemplate == null) {
visitJoinClause(sql);
if(queryTemplate == null) {
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);

@ -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 <tim@todoroo.com>
*
*/
@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<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.
*/
public static final Table[] TABLES = new Table[] {
Alarm.TABLE
TransitionalAlarm.TABLE
};
// --- implementation
private final GenericDao<Alarm> dao = new GenericDao<Alarm>(Alarm.class, this);
private final GenericDao<TransitionalAlarm> dao = new GenericDao<TransitionalAlarm>(TransitionalAlarm.class, this);
@Override
protected String getName() {
@ -58,7 +58,7 @@ public class AlarmDatabase extends AbstractDatabase {
return TABLES;
}
public GenericDao<Alarm> getDao() {
public GenericDao<TransitionalAlarm> 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());
}

@ -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<Alarm> dao = new GenericDao<Alarm>(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<Alarm> getAlarms(long taskId) {
database.openForReading();
Query query = Query.select(Alarm.PROPERTIES).where(Alarm.TASK.eq(taskId));
return dao.query(query);
public TodorooCursor<Metadata> 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<Alarm> 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<Long> 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);
}
}
}

@ -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.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<String> tags = new ArrayList<String>();
private final LinkedHashSet<String> tags = new LinkedHashSet<String>();
public Format1TaskImporter(XmlPullParser xpp) throws XmlPullParserException, IOException {
this.xpp = xpp;

@ -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);

@ -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<Metadata> 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<String> tags) {
public void synchronizeTags(long taskId, LinkedHashSet<String> tags) {
metadataDao.deleteWhere(Criterion.and(MetadataCriteria.byTask(taskId),
MetadataCriteria.withKey(KEY)));

@ -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<String> tags = new ArrayList<String>();
LinkedHashSet<String> tags = new LinkedHashSet<String>();
for(int i = 0; i < tagsContainer.getChildCount(); i++) {
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.DatePickerDialog;
import android.app.TabActivity;
import android.app.DatePickerDialog.OnDateSetListener;
import android.app.TabActivity;
import android.content.BroadcastReceiver;
import android.content.Context;
import android.content.DialogInterface;
import android.content.DialogInterface.OnCancelListener;
import android.content.Intent;
import android.content.IntentFilter;
import android.content.DialogInterface.OnCancelListener;
import android.content.res.Resources;
import android.graphics.Color;
import android.os.Bundle;
import android.view.LayoutInflater;
import android.view.Menu;
@ -44,6 +45,7 @@ import android.view.View;
import android.view.ViewGroup;
import android.view.ViewGroup.LayoutParams;
import android.widget.AdapterView;
import android.widget.AdapterView.OnItemSelectedListener;
import android.widget.ArrayAdapter;
import android.widget.Button;
import android.widget.CheckBox;
@ -58,7 +60,6 @@ import android.widget.TabHost;
import android.widget.TimePicker;
import android.widget.Toast;
import android.widget.ToggleButton;
import android.widget.AdapterView.OnItemSelectedListener;
import com.flurry.android.FlurryAgent;
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.utility.AndroidUtilities;
import com.todoroo.andlib.utility.DateUtilities;
import com.todoroo.astrid.alarms.AlarmControlSet;
import com.todoroo.astrid.api.AstridApiConstants;
import com.todoroo.astrid.dao.Database;
import com.todoroo.astrid.gcal.GCalControlSet;
@ -219,6 +221,8 @@ public final class TaskEditActivity extends TabActivity {
controls.add(new GCalControlSet(this, addonsAddons));
separator(addonsAddons);
controls.add(new TimerControlSet(this, addonsAddons));
separator(addonsAddons);
controls.add(new AlarmControlSet(this, addonsAddons));
}
// show add-on help if necessary
@ -251,7 +255,7 @@ public final class TaskEditActivity extends TabActivity {
*/
private void separator(ViewGroup parent) {
View view = new View(this);
view.setBackgroundResource(R.drawable.black_white_gradient);
view.setBackgroundColor(Color.RED);
view.setPadding(2, 3, 2, 3);
parent.addView(view);
}

@ -128,7 +128,8 @@ public class Astrid2TaskProvider extends ContentProvider {
*/
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);

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

@ -103,7 +103,7 @@ public class TasksWidget extends AppWidgetProvider {
database.openForReading();
cursor = taskService.fetchFiltered(inboxFilter, null, Task.TITLE, Task.DUE_DATE);
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);
task.readFromCursor(cursor);

@ -10,7 +10,7 @@ import com.todoroo.andlib.data.TodorooCursor;
import com.todoroo.andlib.service.Autowired;
import com.todoroo.andlib.service.TestDependencyInjector;
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.dao.MetadataDao;
import com.todoroo.astrid.dao.TaskDao;
@ -363,14 +363,14 @@ public class Astrid2To3UpgradeTests extends DatabaseTestCase {
database.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());
cursor.moveToFirst();
Alarm alarm = new Alarm(cursor);
assertDatesEqual(x1, alarm.getValue(Alarm.TIME));
TransitionalAlarm alarm = new TransitionalAlarm(cursor);
assertDatesEqual(x1, alarm.getValue(TransitionalAlarm.TIME));
cursor.moveToNext();
alarm.readFromCursor(cursor);
assertDatesEqual(x2, alarm.getValue(Alarm.TIME));
assertDatesEqual(x2, alarm.getValue(TransitionalAlarm.TIME));
}
/**

Loading…
Cancel
Save