Made lots of changes in an attempt to clean stuff up

pull/14/head
Tim Su 14 years ago
parent c537ea95c8
commit c43ff1aea6

@ -1,4 +1,4 @@
#Mon Jan 04 09:25:09 PST 2010
#Tue Jun 29 14:53:46 PDT 2010
eclipse.preferences.version=1
org.eclipse.jdt.core.compiler.codegen.inlineJsrBytecode=enabled
org.eclipse.jdt.core.compiler.codegen.targetPlatform=1.6
@ -10,6 +10,8 @@ org.eclipse.jdt.core.compiler.debug.sourceFile=generate
org.eclipse.jdt.core.compiler.problem.annotationSuperInterface=warning
org.eclipse.jdt.core.compiler.problem.assertIdentifier=error
org.eclipse.jdt.core.compiler.problem.autoboxing=ignore
org.eclipse.jdt.core.compiler.problem.comparingIdentical=warning
org.eclipse.jdt.core.compiler.problem.deadCode=warning
org.eclipse.jdt.core.compiler.problem.deprecation=warning
org.eclipse.jdt.core.compiler.problem.deprecationInDeprecatedCode=disabled
org.eclipse.jdt.core.compiler.problem.deprecationWhenOverridingDeprecatedMethod=disabled
@ -29,8 +31,10 @@ org.eclipse.jdt.core.compiler.problem.indirectStaticAccess=ignore
org.eclipse.jdt.core.compiler.problem.localVariableHiding=warning
org.eclipse.jdt.core.compiler.problem.methodWithConstructorName=warning
org.eclipse.jdt.core.compiler.problem.missingDeprecatedAnnotation=ignore
org.eclipse.jdt.core.compiler.problem.missingHashCodeMethod=ignore
org.eclipse.jdt.core.compiler.problem.missingOverrideAnnotation=ignore
org.eclipse.jdt.core.compiler.problem.missingSerialVersion=warning
org.eclipse.jdt.core.compiler.problem.missingSynchronizedOnInheritedMethod=ignore
org.eclipse.jdt.core.compiler.problem.noEffectAssignment=warning
org.eclipse.jdt.core.compiler.problem.noImplicitStringConversion=warning
org.eclipse.jdt.core.compiler.problem.nonExternalizedStringLiteral=warning

@ -1,4 +1,4 @@
#Thu Jul 02 10:50:56 PDT 2009
#Tue Jun 29 14:53:46 PDT 2010
cleanup.add_default_serial_version_id=true
cleanup.add_generated_serial_version_id=false
cleanup.add_missing_annotations=true
@ -52,6 +52,58 @@ cleanup.use_this_for_non_static_method_access_only_if_necessary=true
cleanup_profile=_Astrid
cleanup_settings_version=2
eclipse.preferences.version=1
editor_save_participant_org.eclipse.jdt.ui.postsavelistener.cleanup=true
formatter_profile=_Astrid
formatter_settings_version=11
org.eclipse.jdt.ui.text.custom_code_templates=<?xml version\="1.0" encoding\="UTF-8" standalone\="no"?><templates/>
sp_cleanup.add_default_serial_version_id=true
sp_cleanup.add_generated_serial_version_id=false
sp_cleanup.add_missing_annotations=true
sp_cleanup.add_missing_deprecated_annotations=true
sp_cleanup.add_missing_methods=false
sp_cleanup.add_missing_nls_tags=false
sp_cleanup.add_missing_override_annotations=true
sp_cleanup.add_serial_version_id=false
sp_cleanup.always_use_blocks=true
sp_cleanup.always_use_parentheses_in_expressions=false
sp_cleanup.always_use_this_for_non_static_field_access=false
sp_cleanup.always_use_this_for_non_static_method_access=false
sp_cleanup.convert_to_enhanced_for_loop=false
sp_cleanup.correct_indentation=false
sp_cleanup.format_source_code=false
sp_cleanup.format_source_code_changes_only=false
sp_cleanup.make_local_variable_final=false
sp_cleanup.make_parameters_final=false
sp_cleanup.make_private_fields_final=true
sp_cleanup.make_type_abstract_if_missing_method=false
sp_cleanup.make_variable_declarations_final=true
sp_cleanup.never_use_blocks=false
sp_cleanup.never_use_parentheses_in_expressions=true
sp_cleanup.on_save_use_additional_actions=true
sp_cleanup.organize_imports=true
sp_cleanup.qualify_static_field_accesses_with_declaring_class=false
sp_cleanup.qualify_static_member_accesses_through_instances_with_declaring_class=true
sp_cleanup.qualify_static_member_accesses_through_subtypes_with_declaring_class=true
sp_cleanup.qualify_static_member_accesses_with_declaring_class=false
sp_cleanup.qualify_static_method_accesses_with_declaring_class=false
sp_cleanup.remove_private_constructors=true
sp_cleanup.remove_trailing_whitespaces=true
sp_cleanup.remove_trailing_whitespaces_all=true
sp_cleanup.remove_trailing_whitespaces_ignore_empty=false
sp_cleanup.remove_unnecessary_casts=false
sp_cleanup.remove_unnecessary_nls_tags=true
sp_cleanup.remove_unused_imports=true
sp_cleanup.remove_unused_local_variables=false
sp_cleanup.remove_unused_private_fields=true
sp_cleanup.remove_unused_private_members=false
sp_cleanup.remove_unused_private_methods=true
sp_cleanup.remove_unused_private_types=true
sp_cleanup.sort_members=false
sp_cleanup.sort_members_all=false
sp_cleanup.use_blocks=false
sp_cleanup.use_blocks_only_for_return_and_throw=false
sp_cleanup.use_parentheses_in_expressions=false
sp_cleanup.use_this_for_non_static_field_access=false
sp_cleanup.use_this_for_non_static_field_access_only_if_necessary=true
sp_cleanup.use_this_for_non_static_method_access=false
sp_cleanup.use_this_for_non_static_method_access_only_if_necessary=true

@ -160,6 +160,33 @@
android:readPermission="com.timsu.astrid.permission.READ_TASKS"
/>
<!-- ====================== Internal Plug-ins ======================= -->
<!-- ====================== Filters ======================= -->
<receiver android:name="com.todoroo.astrid.filters.FilterExposer">
<intent-filter>
<action android:name="com.todoroo.astrid.REQUEST_FILTERS" />
<category android:name="android.intent.category.DEFAULT" />
</intent-filter>
</receiver>
<!-- ====================== Tags ======================= -->
<receiver android:name="com.todoroo.astrid.tags.FilterExposer">
<intent-filter>
<action android:name="com.todoroo.astrid.REQUEST_FILTERS" />
<category android:name="android.intent.category.DEFAULT" />
</intent-filter>
</receiver>
<receiver android:name=".tags.DetailExposer">
<intent-filter>
<action android:name="com.todoroo.astrid.REQUEST_DETAILS" />
<category android:name="android.intent.category.DEFAULT" />
</intent-filter>
</receiver>
</application>
</manifest>

@ -39,10 +39,22 @@ public class AstridApiConstants {
public static final String EXTRAS_ITEMS = "items";
/**
* Extras name for your plug-in name, used for logging errors to LogCat
* Extras name for plug-in object
*/
public static final String EXTRAS_PLUGIN = "plugin";
// --- Plug-ins API
/**
* Action name for broadcast intent requesting filters
*/
public static final String BROADCAST_REQUEST_PLUGINS = PACKAGE + ".REQUEST_PLUGINS";
/**
* Action name for broadcast intent sending filters back to Astrid
*/
public static final String BROADCAST_SEND_PLUGINS = PACKAGE + ".SEND_PLUGINS";
// --- Filters API
/**

@ -1,184 +0,0 @@
/**
* See the file "LICENSE" for the full license governing this code.
*/
package com.todoroo.astrid.api;
import android.net.Uri;
/**
* Constants for interfacing with Astrid's Content Providers.
*
* @author Tim Su <tim@todoroo.com>
*/
@SuppressWarnings("nls")
public class AstridContentProvider {
/**
* Content Provider
*/
public static final String PROVIDER = "com.todoroo.astrid.provider";
// --- methods for generating URI's for accessing Astrid data
/**
* URI for:
* <ul>
* <li>Queries on multiple tasks
* <li>Inserting new tasks
* <li>Deleting multiple tasks at a time
* <li>Updating multiple tasks at a time
* </ul>
* If your selection clause contains metadata columns, you need to use
* <code>allItemsWithMetadataUri</code> instead of this one.
*/
public static Uri allItemsUri() {
return Uri.parse("content://" + PROVIDER + "/items");
}
/**
* URI for:
* <ul>
* <li>Querying on tasks with metadata columns in selection
* <li>Deleting multiple tasks with metadata columns in selection
* <li>Updating multiple tasks with metadata columns in selection
* </ul>
* If, for example, you have defined metadata key 'tag' and wish to delete
* all tasks where 'tag' = 'deleteme', you would use this URI. For querying
* or insertion, use <code>allItemsUri</code>.
* <p>
* For queries, <code>allItemsUri</code> will be more efficient, but will
* not work if your selection clause contains columns not mentioned in your
* projection
*
* @param metadata
* array of metadata columns you wish to select using
*
*/
public static Uri allItemsWithMetadataUri(String[] metadata) {
if(metadata == null || metadata.length == 0)
throw new IllegalArgumentException("You must provide metadata");
StringBuilder builder = new StringBuilder();
for(int i = 0; i < metadata.length; i++)
builder.append(escapeUriSubComponent(metadata[i])).append(
SUB_COMPONENT_SEPARATOR);
return Uri.parse("content://" + PROVIDER + "/itemsWith/" +
escapeUriComponent(builder.toString()));
}
/**
* URI for:
* <ul>
* <li>Queries on a single task
* <li>Updating fields for a single task
* <li>Deleting a single task
* </ul>
*
* @param id
* id of task to fetch
*/
public static Uri singleItemUri(long id) {
return Uri.parse("content://" + PROVIDER + "/" + id);
}
/**
* URI for:
* <ul>
* <li>Queries on multiple tasks, grouped by column
* </ul>
* @param groupBy
* column name to group by
*/
public static Uri groupByUri(String groupBy) {
groupBy = escapeUriComponent(groupBy);
return Uri.parse("content://" + PROVIDER + "/groupby/" + groupBy);
}
// --- task built-in columns and constnats
/**
* A task in Astrid represents a single item in a user's task list
*
* @author Tim Su <tim@todoroo.com>
*/
public static class AstridTask {
// --- columns
/** long: Task id */
public static final String ID = "_id";
/** String: name of Task */
public static final String TITLE = "title";
/** int: Task Urgency setting (see <code>Task.URGENCY_*</code>) */
public static final String URGENCY = "urgency";
/** int: Task Importance setting (see <code>Task.IMPORTANCE_*</code>) */
public static final String IMPORTANCE = "importance";
/** int: unixtime Task is due, 0 if not set */
public static final String DUE_DATE = "dueDate";
/** int: unixtime Task should be hidden until, 0 if not set */
public static final String HIDDEN_UNTIL = "hiddenUntil";
/** int: unixtime Task was created */
public static final String CREATION_DATE = "creationDate";
/** int: unixtime Task was completed, 0 if task not completed */
public static final String COMPLETION_DATE = "completionDate";
/** int: unixtime Task was deleted, 0 if task not deleted */
public static final String DELETION_DATE = "deletionDate";
/** int: unixtime Task was modified */
public static final String MODIFICATION_DATE = "modificationDate";
// --- urgency settings
public static final int URGENCY_NONE = 0;
public static final int URGENCY_TODAY = 1;
public static final int URGENCY_THIS_WEEK = 2;
public static final int URGENCY_THIS_MONTH = 3;
public static final int URGENCY_WITHIN_THREE_MONTHS = 4;
public static final int URGENCY_WITHIN_SIX_MONTHS = 5;
public static final int URGENCY_WITHIN_A_YEAR = 6;
public static final int URGENCY_SPECIFIC_DAY = 7;
public static final int URGENCY_SPECIFIC_DAY_TIME = 8;
// --- importance settings
public static final int IMPORTANCE_DO_OR_DIE = 0;
public static final int IMPORTANCE_MUST_DO = 1;
public static final int IMPORTANCE_SHOULD_DO = 2;
public static final int IMPORTANCE_NONE = 3;
}
// --- internal methods
/**
* Escapes a string for use in a URI. Used internally to pass extra data
* to the content provider.
* @param component
* @return
*/
private static String escapeUriComponent(String component) {
return component.replace("%", "%o").replace("/", "%s");
}
private static final String SUB_COMPONENT_SEPARATOR = "|";
/**
* Escapes a string for use as part of a URI string. Used internally to pass extra data
* to the content provider.
* @param component
* @return
*/
private static String escapeUriSubComponent(String component) {
return component.replace("$", "$o").replace(SUB_COMPONENT_SEPARATOR, "$s");
}
}

@ -13,12 +13,12 @@ import android.os.Parcelable;
* @author Tim Su <tim@todoroo.com>
*
*/
public class EditOperation implements Parcelable {
public final class EditOperation implements Parcelable {
/**
* Plugin Id
*/
public String plugin = null;
public final String plugin;
/**
* Label
@ -33,13 +33,15 @@ public class EditOperation implements Parcelable {
/**
* Create an EditOperation object
*
* @param plugin
* {@link Plugin} identifier that encompasses object
* @param text
* label to display
* @param intent
* intent to invoke. {@link EXTRAS_TASK_ID} will be passed
*/
public EditOperation(String text, Intent intent) {
super();
public EditOperation(String plugin, String text, Intent intent) {
this.plugin = plugin;
this.text = text;
this.intent = intent;
}
@ -57,6 +59,7 @@ public class EditOperation implements Parcelable {
* {@inheritDoc}
*/
public void writeToParcel(Parcel dest, int flags) {
dest.writeString(plugin);
dest.writeString(text);
dest.writeParcelable(intent, 0);
}
@ -69,8 +72,8 @@ public class EditOperation implements Parcelable {
* {@inheritDoc}
*/
public EditOperation createFromParcel(Parcel source) {
return new EditOperation(source.readString(), (Intent)source.readParcelable(
Intent.class.getClassLoader()));
return new EditOperation(source.readString(), source.readString(),
(Intent)source.readParcelable(Intent.class.getClassLoader()));
}
/**

@ -3,10 +3,11 @@
*/
package com.todoroo.astrid.api;
import android.content.ContentValues;
import android.os.Parcel;
import android.os.Parcelable;
import com.todoroo.astrid.api.AstridContentProvider.AstridTask;
import com.todoroo.andlib.sql.QueryTemplate;
/**
* A <code>FilterListFilter</code> allows users to display tasks that have
@ -19,7 +20,12 @@ import com.todoroo.astrid.api.AstridContentProvider.AstridTask;
* @author Tim Su <tim@todoroo.com>
*
*/
public class Filter extends FilterListItem {
public final class Filter extends FilterListItem {
/**
* Plug-in Identifier
*/
public final String plugin;
/**
* Expanded title of this filter. This is displayed at the top
@ -31,15 +37,14 @@ public class Filter extends FilterListItem {
/**
* SQL query for this filter. The query will be appended to the select
* statement after "<code>SELECT fields FROM table %s</code>". Use
* {@link AstridApiConstants.TASK_TABLE} and
* {@link AstridApiConstants.METADATA_TABLE} as table names,
* {@link AstridTask} for field names.
* statement after "<code>SELECT fields FROM table %s</code>". It is
* recommended that you use a {@link QueryTemplate} to construct your
* query.
* <p>
* Examples:
* <ul>
* <li><code>" WHERE completionDate = 0"</code>
* <li><code>" INNER JOIN " +
* <li><code>"WHERE completionDate = 0"</code>
* <li><code>"INNER JOIN " +
* Constants.TABLE_METADATA + " ON metadata.task = tasks.id WHERE
* metadata.namespace = " + NAMESPACE + " AND metadata.key = 'a' AND
* metadata.value = 'b' GROUP BY tasks.id ORDER BY tasks.title"</code>
@ -48,25 +53,18 @@ public class Filter extends FilterListItem {
public String sqlQuery;
/**
* SQL query to execute on a task when quick-creating a new task while viewing
* this filter. For example, when a user views tasks tagged 'ABC', the
* Values to apply to a task when quick-adding a task from this filter.
* For example, when a user views tasks tagged 'ABC', the
* tasks they create should also be tagged 'ABC'. If set to null, no
* query will be executed. In this string, $ID will be replaced with the
* task id.
* <p>
* Examples:
* <ul>
* <li><code>"INSERT INTO " + Constants.TABLE_METADATA + " (task,
* namespace, key, string) VALUES ($ID, " + ... + ")"</code>
* <li><code>"UPDATE " + Constants.TABLE_TASK + " SET urgency = 0
* WHERE _id = $ID"</code>
* </ul>
* additional values will be stored for a task.
*/
public String sqlForNewTasks = null;
public ContentValues valuesForNewTasks = null;
/**
* Utility constructor for creating a TaskList object
*
* @param plugin
* {@link Plugin} identifier that encompasses object
* @param listingTitle
* Title of this item as displayed on the lists page, e.g. Inbox
* @param title
@ -74,22 +72,26 @@ public class Filter extends FilterListItem {
* filter, e.g. Inbox (20 tasks)
* @param sqlQuery
* SQL query for this list (see {@link sqlQuery} for examples).
* @param sqlForNewTasks
* @param valuesForNewTasks
* see {@link sqlForNewTasks}
*/
public Filter(String listingTitle,
String title, String sqlQuery, String sqlForNewTasks) {
public Filter(String plugin, String listingTitle,
String title, QueryTemplate sqlQuery, ContentValues valuesForNewTasks) {
this.plugin = plugin;
this.listingTitle = listingTitle;
this.title = title;
this.sqlQuery = sqlQuery;
this.sqlForNewTasks = sqlForNewTasks;
this.sqlQuery = sqlQuery.toString();
this.valuesForNewTasks = valuesForNewTasks;
}
/**
* Blank constructor
* Utility constructor
*
* @param plugin
* {@link Plugin} identifier that encompasses object
*/
public Filter() {
//
protected Filter(String plugin) {
this.plugin = plugin;
}
// --- parcelable
@ -106,10 +108,11 @@ public class Filter extends FilterListItem {
*/
@Override
public void writeToParcel(Parcel dest, int flags) {
dest.writeString(plugin);
super.writeToParcel(dest, flags);
dest.writeString(title);
dest.writeString(sqlQuery);
dest.writeString(sqlForNewTasks);
dest.writeParcelable(valuesForNewTasks, 0);
}
/**
@ -121,11 +124,11 @@ public class Filter extends FilterListItem {
* {@inheritDoc}
*/
public Filter createFromParcel(Parcel source) {
Filter item = new Filter();
Filter item = new Filter(source.readString());
item.readFromParcel(source);
item.title = source.readString();
item.sqlQuery = source.readString();
item.sqlForNewTasks = source.readString();
item.valuesForNewTasks = source.readParcelable(ContentValues.class.getClassLoader());
return item;
}

@ -15,6 +15,11 @@ import android.os.Parcelable;
*/
public class FilterCategory extends FilterListItem {
/**
* Plug-in Identifier
*/
public final String plugin;
/**
* {@link Filter}s contained by this category
*/
@ -23,22 +28,28 @@ public class FilterCategory extends FilterListItem {
/**
* Constructor for creating a new FilterCategory
*
* @param plugin
* {@link Plugin} identifier that encompasses object
* @param listingTitle
* Title of this item as displayed on the lists page, e.g. Inbox
* @param children
* filters belonging to this category
*/
public FilterCategory(String listingTitle,
public FilterCategory(String plugin, String listingTitle,
Filter[] children) {
this.plugin = plugin;
this.listingTitle = listingTitle;
this.children = children;
}
/**
* Blank constructor
* Constructor for creating a new FilterCategory
*
* @param plugin
* {@link Plugin} identifier that encompasses object
*/
public FilterCategory() {
//
protected FilterCategory(String plugin) {
this.plugin = plugin;
}
// --- parcelable
@ -55,6 +66,7 @@ public class FilterCategory extends FilterListItem {
*/
@Override
public void writeToParcel(Parcel dest, int flags) {
dest.writeString(plugin);
super.writeToParcel(dest, flags);
dest.writeParcelableArray(children, 0);
}
@ -68,7 +80,7 @@ public class FilterCategory extends FilterListItem {
* {@inheritDoc}
*/
public FilterCategory createFromParcel(Parcel source) {
FilterCategory item = new FilterCategory();
FilterCategory item = new FilterCategory(source.readString());
item.readFromParcel(source);
Parcelable[] parcelableChildren = source.readParcelableArray(

@ -8,44 +8,57 @@ import android.os.Parcelable;
/**
* Section Header for Filter List
*
*
* @author Tim Su <tim@todoroo.com>
*
*/
public class FilterListHeader extends FilterListItem {
/**
* Plug-in Identifier
*/
public final String plugin;
/**
* Constructor for creating a new FilterListHeader
*
*
* @param plugin
* {@link Plugin} identifier that encompasses object
* @param listingTitle
* @param listingIconResource
* @param priority
*/
public FilterListHeader(String listingTitle) {
public FilterListHeader(String plugin, String listingTitle) {
this.plugin = plugin;
this.listingTitle = listingTitle;
}
/**
* Empty constructor
* Constructor for creating a new FilterListHeader
*
* @param plugin
* {@link Plugin} identifier that encompasses object
*/
public FilterListHeader() {
//
protected FilterListHeader(String plugin) {
this.plugin = plugin;
}
// --- parcelable
public int describeContents() {
return 0;
}
@Override
public void writeToParcel(Parcel dest, int flags) {
dest.writeString(plugin);
super.writeToParcel(dest, flags);
}
public static final Parcelable.Creator<FilterListHeader> CREATOR = new Parcelable.Creator<FilterListHeader>() {
public FilterListHeader createFromParcel(Parcel source) {
FilterListHeader item = new FilterListHeader();
FilterListHeader item = new FilterListHeader(source.readString());
item.readFromParcel(source);
return item;
}
@ -53,6 +66,6 @@ public class FilterListHeader extends FilterListItem {
public FilterListHeader[] newArray(int size) {
return new FilterListHeader[size];
}
};
}

@ -57,6 +57,7 @@ abstract public class FilterListItem implements Parcelable {
/**
* Utility method to read FilterListItem properties from a parcel.
*
* @param source
*/
public void readFromParcel(Parcel source) {

@ -0,0 +1,93 @@
/**
* See the file "LICENSE" for the full license governing this code.
*/
package com.todoroo.astrid.api;
import android.os.Parcel;
import android.os.Parcelable;
/**
* Represents a plug-in for Astrid. Users can enable or disable plug-ins,
* which affect all other extension points that share the same identifier.
*
* @author Tim Su <tim@todoroo.com>
*
*/
public class Plugin implements Parcelable {
/**
* Plug-in Identifier
*/
public String plugin = null;
/**
* Plug-in Title
*/
public String title = null;
/**
* Plug-in Author
*/
public String author = null;
/**
* Plug-in Description
*/
public String description = null;
/**
* Convenience constructor to generate a plug-in object
*
* @param plugin
* @param title
* @param author
* @param description
*/
public Plugin(String plugin, String title, String author, String description) {
this.plugin = plugin;
this.title = title;
this.author = author;
this.description = description;
}
// --- parcelable helpers
/**
* {@inheritDoc}
*/
public int describeContents() {
return 0;
}
/**
* {@inheritDoc}
*/
public void writeToParcel(Parcel dest, int flags) {
dest.writeString(plugin);
dest.writeString(title);
dest.writeString(author);
dest.writeString(description);
}
/**
* Parcelable creator
*/
public static final Parcelable.Creator<Plugin> CREATOR = new Parcelable.Creator<Plugin>() {
/**
* {@inheritDoc}
*/
public Plugin createFromParcel(Parcel source) {
return new Plugin(source.readString(), source.readString(),
source.readString(), source.readString());
}
/**
* {@inheritDoc}
*/
public Plugin[] newArray(int size) {
return new Plugin[size];
};
};
}

@ -12,7 +12,12 @@ import android.os.Parcelable;
* @author Tim Su <tim@todoroo.com>
*
*/
public class TaskDetail implements Parcelable {
public final class TaskDetail implements Parcelable {
/**
* Plug-in Identifier
*/
public final String plugin;
/**
* Text of detail
@ -27,13 +32,15 @@ public class TaskDetail implements Parcelable {
/**
* Creates a TaskDetail object
*
* @param plugin
* {@link Plugin} identifier that encompasses object
* @param text
* text to display
* @param color
* color to use for text. Use <code>0</code> for default color
*/
public TaskDetail(String text, int color) {
super();
public TaskDetail(String plugin, String text, int color) {
this.plugin = plugin;
this.text = text;
this.color = color;
}
@ -44,8 +51,8 @@ public class TaskDetail implements Parcelable {
* @param text
* text to display
*/
public TaskDetail(String text) {
this(text, 0);
public TaskDetail(String plugin, String text) {
this(plugin, text, 0);
}
@ -63,6 +70,7 @@ public class TaskDetail implements Parcelable {
* {@inheritDoc}
*/
public void writeToParcel(Parcel dest, int flags) {
dest.writeString(plugin);
dest.writeString(text);
dest.writeInt(color);
}
@ -75,7 +83,7 @@ public class TaskDetail implements Parcelable {
* {@inheritDoc}
*/
public TaskDetail createFromParcel(Parcel source) {
return new TaskDetail(source.readString(), source.readInt());
return new TaskDetail(source.readString(), source.readString(), source.readInt());
}
/**

@ -11,8 +11,8 @@ import java.lang.reflect.InvocationTargetException;
import android.content.ContentValues;
import android.database.Cursor;
import com.todoroo.andlib.data.sql.Criterion;
import com.todoroo.andlib.data.sql.Query;
import com.todoroo.andlib.sql.Criterion;
import com.todoroo.andlib.sql.Query;

@ -5,7 +5,7 @@
*/
package com.todoroo.andlib.data;
import com.todoroo.andlib.data.sql.Field;
import com.todoroo.andlib.sql.Field;
/**
* Property represents a typed column in a database.

@ -1,6 +1,7 @@
package com.todoroo.andlib.data;
import com.todoroo.andlib.data.sql.Field;
import com.todoroo.andlib.sql.Field;
import com.todoroo.andlib.sql.SqlTable;
/**
* Table class. Most fields are final, so methods such as <code>as</code> will
@ -9,7 +10,7 @@ import com.todoroo.andlib.data.sql.Field;
* @author Tim Su <tim@todoroo.com>
*
*/
public final class Table extends com.todoroo.andlib.data.sql.Table {
public final class Table extends SqlTable {
public final String name;
public final Class<? extends AbstractModel> modelClass;

@ -1,5 +0,0 @@
package com.todoroo.andlib.data.sql;
public enum OrderType {
DESC, ASC
}

@ -1,7 +1,7 @@
package com.todoroo.andlib.data.sql;
package com.todoroo.andlib.sql;
@SuppressWarnings("nls")
public class Constants {
public final class Constants {
static final String SELECT = "SELECT";
static final String SPACE = " ";
static final String AS = "AS";

@ -1,12 +1,12 @@
package com.todoroo.andlib.data.sql;
package com.todoroo.andlib.sql;
import static com.todoroo.andlib.data.sql.Constants.AND;
import static com.todoroo.andlib.data.sql.Constants.EXISTS;
import static com.todoroo.andlib.data.sql.Constants.LEFT_PARENTHESIS;
import static com.todoroo.andlib.data.sql.Constants.NOT;
import static com.todoroo.andlib.data.sql.Constants.OR;
import static com.todoroo.andlib.data.sql.Constants.RIGHT_PARENTHESIS;
import static com.todoroo.andlib.data.sql.Constants.SPACE;
import static com.todoroo.andlib.sql.Constants.AND;
import static com.todoroo.andlib.sql.Constants.EXISTS;
import static com.todoroo.andlib.sql.Constants.LEFT_PARENTHESIS;
import static com.todoroo.andlib.sql.Constants.NOT;
import static com.todoroo.andlib.sql.Constants.OR;
import static com.todoroo.andlib.sql.Constants.RIGHT_PARENTHESIS;
import static com.todoroo.andlib.sql.Constants.SPACE;
public abstract class Criterion {
protected final Operator operator;

@ -1,7 +1,7 @@
package com.todoroo.andlib.data.sql;
package com.todoroo.andlib.sql;
import static com.todoroo.andlib.data.sql.Constants.AS;
import static com.todoroo.andlib.data.sql.Constants.SPACE;
import static com.todoroo.andlib.sql.Constants.AS;
import static com.todoroo.andlib.sql.Constants.SPACE;
public abstract class DBObject<T extends DBObject<?>> implements Cloneable {
protected String alias;

@ -1,4 +1,4 @@
package com.todoroo.andlib.data.sql;
package com.todoroo.andlib.sql;
public class EqCriterion extends UnaryCriterion {
EqCriterion(Field field, Object value) {

@ -1,11 +1,11 @@
package com.todoroo.andlib.data.sql;
import static com.todoroo.andlib.data.sql.Constants.AND;
import static com.todoroo.andlib.data.sql.Constants.BETWEEN;
import static com.todoroo.andlib.data.sql.Constants.COMMA;
import static com.todoroo.andlib.data.sql.Constants.LEFT_PARENTHESIS;
import static com.todoroo.andlib.data.sql.Constants.RIGHT_PARENTHESIS;
import static com.todoroo.andlib.data.sql.Constants.SPACE;
package com.todoroo.andlib.sql;
import static com.todoroo.andlib.sql.Constants.AND;
import static com.todoroo.andlib.sql.Constants.BETWEEN;
import static com.todoroo.andlib.sql.Constants.COMMA;
import static com.todoroo.andlib.sql.Constants.LEFT_PARENTHESIS;
import static com.todoroo.andlib.sql.Constants.RIGHT_PARENTHESIS;
import static com.todoroo.andlib.sql.Constants.SPACE;
public class Field extends DBObject<Field> {

@ -0,0 +1,15 @@
package com.todoroo.andlib.sql;
@SuppressWarnings("nls")
public final class Functions {
public static String caseStatement(Criterion when, Object ifTrue, Object ifFalse) {
return new StringBuilder("CASE WHEN ").
append(when.toString()).append(" THEN ").append(value(ifTrue)).
append(" ELSE ").append(value(ifFalse)).append(" END").toString();
}
private static String value(Object value) {
return value.toString();
}
}

@ -1,4 +1,4 @@
package com.todoroo.andlib.data.sql;
package com.todoroo.andlib.sql;
import java.util.List;
import java.util.ArrayList;

@ -1,33 +1,33 @@
package com.todoroo.andlib.data.sql;
package com.todoroo.andlib.sql;
import static com.todoroo.andlib.data.sql.Constants.JOIN;
import static com.todoroo.andlib.data.sql.Constants.ON;
import static com.todoroo.andlib.data.sql.Constants.SPACE;
import static com.todoroo.andlib.sql.Constants.JOIN;
import static com.todoroo.andlib.sql.Constants.ON;
import static com.todoroo.andlib.sql.Constants.SPACE;
public class Join {
private final Table joinTable;
private final SqlTable joinTable;
private final JoinType joinType;
private final Criterion[] criterions;
private Join(Table table, JoinType joinType, Criterion... criterions) {
private Join(SqlTable table, JoinType joinType, Criterion... criterions) {
joinTable = table;
this.joinType = joinType;
this.criterions = criterions;
}
public static Join inner(Table expression, Criterion... criterions) {
public static Join inner(SqlTable expression, Criterion... criterions) {
return new Join(expression, JoinType.INNER, criterions);
}
public static Join left(Table table, Criterion... criterions) {
public static Join left(SqlTable table, Criterion... criterions) {
return new Join(table, JoinType.LEFT, criterions);
}
public static Join right(Table table, Criterion... criterions) {
public static Join right(SqlTable table, Criterion... criterions) {
return new Join(table, JoinType.RIGHT, criterions);
}
public static Join out(Table table, Criterion... criterions) {
public static Join out(SqlTable table, Criterion... criterions) {
return new Join(table, JoinType.OUT, criterions);
}

@ -1,4 +1,4 @@
package com.todoroo.andlib.data.sql;
package com.todoroo.andlib.sql;
public enum JoinType {
INNER, LEFT, RIGHT, OUT

@ -1,6 +1,6 @@
package com.todoroo.andlib.data.sql;
package com.todoroo.andlib.sql;
import static com.todoroo.andlib.data.sql.Constants.SPACE;
import static com.todoroo.andlib.sql.Constants.SPACE;
import java.util.HashMap;
import java.util.Map;

@ -1,25 +1,25 @@
package com.todoroo.andlib.data.sql;
package com.todoroo.andlib.sql;
import static com.todoroo.andlib.data.sql.Constants.SPACE;
import static com.todoroo.andlib.sql.Constants.SPACE;
public class Order {
private final Field expression;
private final Object expression;
private final OrderType orderType;
private Order(Field expression) {
private Order(Object expression) {
this(expression, OrderType.ASC);
}
private Order(Field expression, OrderType orderType) {
private Order(Object expression, OrderType orderType) {
this.expression = expression;
this.orderType = orderType;
}
public static Order asc(Field expression) {
public static Order asc(Object expression) {
return new Order(expression);
}
public static Order desc(Field expression) {
public static Order desc(Object expression) {
return new Order(expression, OrderType.DESC);
}

@ -0,0 +1,5 @@
package com.todoroo.andlib.sql;
public enum OrderType {
DESC, ASC
}

@ -1,32 +1,31 @@
package com.todoroo.andlib.data.sql;
import static com.todoroo.andlib.data.sql.Constants.ALL;
import static com.todoroo.andlib.data.sql.Constants.COMMA;
import static com.todoroo.andlib.data.sql.Constants.FROM;
import static com.todoroo.andlib.data.sql.Constants.GROUP_BY;
import static com.todoroo.andlib.data.sql.Constants.LEFT_PARENTHESIS;
import static com.todoroo.andlib.data.sql.Constants.ORDER_BY;
import static com.todoroo.andlib.data.sql.Constants.RIGHT_PARENTHESIS;
import static com.todoroo.andlib.data.sql.Constants.SELECT;
import static com.todoroo.andlib.data.sql.Constants.SPACE;
import static com.todoroo.andlib.data.sql.Constants.WHERE;
import static com.todoroo.andlib.data.sql.Table.table;
package com.todoroo.andlib.sql;
import static com.todoroo.andlib.sql.Constants.ALL;
import static com.todoroo.andlib.sql.Constants.COMMA;
import static com.todoroo.andlib.sql.Constants.FROM;
import static com.todoroo.andlib.sql.Constants.GROUP_BY;
import static com.todoroo.andlib.sql.Constants.LEFT_PARENTHESIS;
import static com.todoroo.andlib.sql.Constants.ORDER_BY;
import static com.todoroo.andlib.sql.Constants.RIGHT_PARENTHESIS;
import static com.todoroo.andlib.sql.Constants.SELECT;
import static com.todoroo.andlib.sql.Constants.SPACE;
import static com.todoroo.andlib.sql.Constants.WHERE;
import static com.todoroo.andlib.sql.SqlTable.table;
import static java.util.Arrays.asList;
import java.util.ArrayList;
import java.util.List;
import com.todoroo.andlib.data.Property;
public class Query {
public final class Query {
private Table table;
private List<Criterion> criterions = new ArrayList<Criterion>();
private List<Field> fields = new ArrayList<Field>();
private List<Join> joins = new ArrayList<Join>();
private List<Field> groupBies = new ArrayList<Field>();
private List<Order> orders = new ArrayList<Order>();
private List<Criterion> havings = new ArrayList<Criterion>();
private SqlTable table;
private final ArrayList<Criterion> criterions = new ArrayList<Criterion>();
private final ArrayList<Field> fields = new ArrayList<Field>();
private final ArrayList<Join> joins = new ArrayList<Join>();
private final ArrayList<Field> groupBies = new ArrayList<Field>();
private final ArrayList<Order> orders = new ArrayList<Order>();
private final ArrayList<Criterion> havings = new ArrayList<Criterion>();
private Query(Field... fields) {
this.fields.addAll(asList(fields));
@ -36,7 +35,7 @@ public class Query {
return new Query(fields);
}
public Query from(Table fromTable) {
public Query from(SqlTable fromTable) {
this.table = fromTable;
return this;
}
@ -154,7 +153,7 @@ public class Query {
sql.deleteCharAt(sql.length() - 1).append(SPACE);
}
public Table as(String alias) {
public SqlTable as(String alias) {
return table(LEFT_PARENTHESIS + this.toString() + RIGHT_PARENTHESIS).as(alias);
}

@ -0,0 +1,108 @@
package com.todoroo.andlib.sql;
import static com.todoroo.andlib.sql.Constants.COMMA;
import static com.todoroo.andlib.sql.Constants.GROUP_BY;
import static com.todoroo.andlib.sql.Constants.ORDER_BY;
import static com.todoroo.andlib.sql.Constants.SPACE;
import static com.todoroo.andlib.sql.Constants.WHERE;
import static java.util.Arrays.asList;
import java.util.ArrayList;
/**
* Query Template returns a bunch of criteria that allows a query to be
* constructed
*
* @author Tim Su <tim@todoroo.com>
*
*/
public final class QueryTemplate {
private final ArrayList<Criterion> criterions = new ArrayList<Criterion>();
private final ArrayList<Join> joins = new ArrayList<Join>();
private final ArrayList<Field> groupBies = new ArrayList<Field>();
private final ArrayList<Order> orders = new ArrayList<Order>();
private final ArrayList<Criterion> havings = new ArrayList<Criterion>();
public QueryTemplate join(Join... join) {
joins.addAll(asList(join));
return this;
}
public QueryTemplate where(Criterion criterion) {
criterions.add(criterion);
return this;
}
public QueryTemplate groupBy(Field... groupBy) {
groupBies.addAll(asList(groupBy));
return this;
}
public QueryTemplate orderBy(Order... order) {
orders.addAll(asList(order));
return this;
}
@Override
public String toString() {
StringBuilder sql = new StringBuilder();
visitJoinClause(sql);
visitWhereClause(sql);
visitGroupByClause(sql);
visitOrderByClause(sql);
return sql.toString();
}
private void visitOrderByClause(StringBuilder sql) {
if (orders.isEmpty()) {
return;
}
sql.append(ORDER_BY);
for (Order order : orders) {
sql.append(SPACE).append(order).append(COMMA);
}
sql.deleteCharAt(sql.length() - 1).append(SPACE);
}
@SuppressWarnings("nls")
private void visitGroupByClause(StringBuilder sql) {
if (groupBies.isEmpty()) {
return;
}
sql.append(GROUP_BY);
for (Field groupBy : groupBies) {
sql.append(SPACE).append(groupBy).append(COMMA);
}
sql.deleteCharAt(sql.length() - 1).append(SPACE);
if (havings.isEmpty()) {
return;
}
sql.append("HAVING");
for (Criterion havingCriterion : havings) {
sql.append(SPACE).append(havingCriterion).append(COMMA);
}
sql.deleteCharAt(sql.length() - 1).append(SPACE);
}
private void visitWhereClause(StringBuilder sql) {
if (criterions.isEmpty()) {
return;
}
sql.append(WHERE);
for (Criterion criterion : criterions) {
sql.append(SPACE).append(criterion).append(SPACE);
}
}
private void visitJoinClause(StringBuilder sql) {
for (Join join : joins) {
sql.append(join).append(SPACE);
}
}
public QueryTemplate having(Criterion criterion) {
this.havings.add(criterion);
return this;
}
}

@ -1,13 +1,13 @@
package com.todoroo.andlib.data.sql;
package com.todoroo.andlib.sql;
public class Table extends DBObject<Table> {
public class SqlTable extends DBObject<SqlTable> {
protected Table(String expression) {
protected SqlTable(String expression) {
super(expression);
}
public static Table table(String table) {
return new Table(table);
public static SqlTable table(String table) {
return new SqlTable(table);
}
@SuppressWarnings("nls")

@ -1,6 +1,6 @@
package com.todoroo.andlib.data.sql;
package com.todoroo.andlib.sql;
import static com.todoroo.andlib.data.sql.Constants.SPACE;
import static com.todoroo.andlib.sql.Constants.SPACE;
public class UnaryCriterion extends Criterion {
protected final Field expression;

@ -7,14 +7,10 @@ import java.net.URL;
import java.net.URLConnection;
import android.app.Activity;
import android.app.Notification;
import android.app.NotificationManager;
import android.app.PendingIntent;
import android.content.Context;
import android.content.Intent;
import android.graphics.Bitmap;
import android.graphics.BitmapFactory;
import android.graphics.Color;
import android.net.ConnectivityManager;
import android.net.NetworkInfo;
import android.net.NetworkInfo.State;

@ -54,24 +54,30 @@ public class DateUtilities {
* ====================================================================== */
/** Convert unixtime into date */
public static final Date unixtimeToDate(int seconds) {
if(seconds == 0)
public static final Date unixtimeToDate(long millis) {
if(millis == 0)
return null;
return new Date(seconds * 1000L);
return new Date(millis);
}
/** Convert date into unixtime */
public static final int dateToUnixtime(Date date) {
public static final long dateToUnixtime(Date date) {
if(date == null)
return 0;
return (int)(date.getTime() / 1000);
return date.getTime();
}
/** Returns unixtime for current time */
public static final int now() {
return (int) (System.currentTimeMillis() / 1000L);
public static final long now() {
return System.currentTimeMillis();
}
/** Represents a single day */
public static long ONE_DAY = 3600000L;
/** Represents a single week */
public static long WEEK = 7 * 3600000L;
/* ======================================================================
* =========================================================== formatters
* ====================================================================== */

@ -9,10 +9,16 @@ import android.content.Intent;
import android.content.res.Resources;
import com.timsu.astrid.R;
import com.todoroo.andlib.sql.Criterion;
import com.todoroo.andlib.sql.Functions;
import com.todoroo.andlib.sql.Order;
import com.todoroo.andlib.sql.QueryTemplate;
import com.todoroo.andlib.utility.DateUtilities;
import com.todoroo.astrid.activity.FilterListActivity;
import com.todoroo.astrid.api.AstridApiConstants;
import com.todoroo.astrid.api.Filter;
import com.todoroo.astrid.api.FilterListItem;
import com.todoroo.astrid.dao.TaskDao.TaskCriteria;
import com.todoroo.astrid.model.Task;
/**
@ -21,29 +27,26 @@ import com.todoroo.astrid.model.Task;
* @author Tim Su <tim@todoroo.com>
*
*/
public class FilterExposer extends BroadcastReceiver {
public static Filter buildInboxFilter(Resources r) {
return new Filter(r.getString(R.string.BFE_Inbox),
r.getString(R.string.BFE_Inbox),
/*String.format("WHERE %s AND %s ORDER BY CASE %s WHEN 0 THEN (%d + 1000 * %s) ELSE (%s + 1000 * %s) END ASC", //$NON-NLS-1$
TaskSql.isActive(), TaskSql.isVisible(DateUtilities.now()),
Task.DUE_DATE, DateUtilities.now() + 60 * 24 * 3600, Task.IMPORTANCE,
Task.DUE_DATE, Task.IMPORTANCE)*/ "",
null);
}
public final class CoreFilterExposer extends BroadcastReceiver {
@SuppressWarnings("nls")
@Override
public void onReceive(Context context, Intent intent) {
Resources r = context.getResources();
// build filters
Filter inbox = buildInboxFilter(r);
Filter inbox = new Filter(CorePlugin.pluginIdentifier, r.getString(R.string.BFE_Inbox),
r.getString(R.string.BFE_Inbox),
new QueryTemplate().where(Criterion.and(TaskCriteria.isActive(),
TaskCriteria.isVisible(DateUtilities.now()))).orderBy(
Order.asc(Functions.caseStatement(Task.DUE_DATE.eq(0),
String.format("(%d + 1000 * %s)", DateUtilities.now(), Task.IMPORTANCE),
String.format("(%s + 1000 * %s)", Task.DUE_DATE, Task.IMPORTANCE)))),
null);
Filter all = new Filter(r.getString(R.string.BFE_All),
Filter all = new Filter(CorePlugin.pluginIdentifier, r.getString(R.string.BFE_All),
r.getString(R.string.BFE_All),
String.format("ORDER BY %s DESC", //$NON-NLS-1$
Task.ID.name),
new QueryTemplate().orderBy(Order.desc(Task.MODIFICATION_DATE)),
null);
// transmit filter list

@ -0,0 +1,25 @@
package com.todoroo.astrid.filters;
import android.content.BroadcastReceiver;
import android.content.Context;
import android.content.Intent;
import com.todoroo.astrid.api.AstridApiConstants;
import com.todoroo.astrid.api.Plugin;
@SuppressWarnings("nls")
public class CorePlugin extends BroadcastReceiver {
static final String pluginIdentifier = "core";
@Override
public void onReceive(Context context, Intent intent) {
Plugin plugin = new Plugin(pluginIdentifier, "Core Filters", "Todoroo",
"Provides 'Inbox' and 'All Tasks' Filters");
Intent broadcastIntent = new Intent(AstridApiConstants.BROADCAST_SEND_PLUGINS);
broadcastIntent.putExtra(AstridApiConstants.EXTRAS_PLUGIN, plugin);
context.sendBroadcast(broadcastIntent, AstridApiConstants.PERMISSION_READ);
}
}

@ -0,0 +1,61 @@
/**
* See the file "LICENSE" for the full license governing this code.
*/
package com.todoroo.astrid.filters;
import android.content.BroadcastReceiver;
import android.content.ContentValues;
import android.content.Context;
import android.content.Intent;
import android.content.res.Resources;
import com.todoroo.andlib.sql.Criterion;
import com.todoroo.andlib.sql.Order;
import com.todoroo.andlib.sql.QueryTemplate;
import com.todoroo.andlib.utility.DateUtilities;
import com.todoroo.astrid.activity.FilterListActivity;
import com.todoroo.astrid.api.AstridApiConstants;
import com.todoroo.astrid.api.Filter;
import com.todoroo.astrid.api.FilterListItem;
import com.todoroo.astrid.dao.TaskDao.TaskCriteria;
import com.todoroo.astrid.model.Task;
/**
* Exposes Astrid's built in filters to the {@link FilterListActivity}
*
* @author Tim Su <tim@todoroo.com>
*
*/
public final class ExtendedFilterExposer extends BroadcastReceiver {
@SuppressWarnings("nls")
@Override
public void onReceive(Context context, Intent intent) {
Resources r = context.getResources();
// build filters
ContentValues hiddenValues = new ContentValues();
hiddenValues.put(Task.HIDE_UNTIL, DateUtilities.now() + DateUtilities.ONE_DAY);
Filter hidden = new Filter(ExtendedPlugin.pluginIdentifier, "Hidden Tasks",
"Hidden Tasks",
new QueryTemplate().where(Criterion.and(TaskCriteria.isActive(),
Criterion.not(TaskCriteria.isVisible(DateUtilities.now())))).
orderBy(Order.asc(Task.HIDE_UNTIL)),
hiddenValues);
Filter alphabetical = new Filter(ExtendedPlugin.pluginIdentifier,
"Inbox (sorted by name)",
"Inbox (sorted by name)",
new QueryTemplate().orderBy(Order.asc(Task.TITLE)),
null);
// transmit filter list
FilterListItem[] list = new FilterListItem[2];
list[0] = inbox;
list[1] = all;
Intent broadcastIntent = new Intent(AstridApiConstants.BROADCAST_SEND_FILTERS);
broadcastIntent.putExtra(AstridApiConstants.EXTRAS_ITEMS, list);
context.sendBroadcast(broadcastIntent, AstridApiConstants.PERMISSION_READ);
}
}

@ -0,0 +1,25 @@
package com.todoroo.astrid.filters;
import android.content.BroadcastReceiver;
import android.content.Context;
import android.content.Intent;
import com.todoroo.astrid.api.AstridApiConstants;
import com.todoroo.astrid.api.Plugin;
@SuppressWarnings("nls")
public class ExtendedPlugin extends BroadcastReceiver {
static final String pluginIdentifier = "extended";
@Override
public void onReceive(Context context, Intent intent) {
Plugin plugin = new Plugin(pluginIdentifier, "Extended Filters", "Todoroo",
"Provides extended filters for viewing subsets of your tasks");
Intent broadcastIntent = new Intent(AstridApiConstants.BROADCAST_SEND_PLUGINS);
broadcastIntent.putExtra(AstridApiConstants.EXTRAS_PLUGIN, plugin);
context.sendBroadcast(broadcastIntent, AstridApiConstants.PERMISSION_READ);
}
}

@ -0,0 +1,81 @@
/**
* See the file "LICENSE" for the full license governing this code.
*/
package com.todoroo.astrid.tags;
import android.content.BroadcastReceiver;
import android.content.Context;
import android.content.Intent;
import com.todoroo.astrid.R;
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.tags.DataService.Tag;
/**
* Exposes filters based on tags
*
* @author Tim Su <tim@todoroo.com>
*
*/
public class FilterExposer extends BroadcastReceiver {
@SuppressWarnings("nls")
private Filter filterFromTag(Context context, Tag tag, DataService tagService) {
String listTitle = context.getString(R.string.tag_FEx_tag_w_size).
replace("$T", tag.tag).replace("$C", Integer.toString(tag.count));
String title = context.getString(R.string.tag_FEx_name, tag.tag);
Filter filter = new Filter(listTitle, title,
tagService.getQuery(tag.tag),
tagService.getNewTaskSql(tag.tag));
// filters[0].contextMenuLabels = new String[] {
// "Rename Tag",
// "Delete Tag"
// };
// filters[0].contextMenuIntents = new Intent[] {
// new Intent(),
// new Intent()
// };
return filter;
}
@Override
public void onReceive(Context context, Intent intent) {
DataService tagService = new DataService(context);
Tag[] tagsByAlpha = tagService.getGroupedTags(DataService.GROUPED_TAGS_BY_ALPHA);
// If user does not have any tags, don't show this section at all
if(tagsByAlpha.length == 0)
return;
Tag[] tagsBySize = tagService.getGroupedTags(DataService.GROUPED_TAGS_BY_SIZE);
Filter[] filtersByAlpha = new Filter[tagsByAlpha.length];
for(int i = 0; i < tagsByAlpha.length; i++)
filtersByAlpha[i] = filterFromTag(context, tagsByAlpha[i], tagService);
Filter[] filtersBySize = new Filter[tagsBySize.length];
for(int i = 0; i < tagsBySize.length; i++)
filtersBySize[i] = filterFromTag(context, tagsBySize[i], tagService);
FilterListHeader tagsHeader = new FilterListHeader(context.getString(R.string.tag_FEx_header));
FilterCategory tagsCategoryBySize = new FilterCategory(
context.getString(R.string.tag_FEx_by_size), filtersBySize);
FilterCategory tagsCategoryByAlpha = new FilterCategory(context.getString(R.string.tag_FEx_alpha), filtersByAlpha);
// transmit filter list
FilterListItem[] list = new FilterListItem[3];
list[0] = tagsHeader;
list[1] = tagsCategoryBySize;
list[2] = tagsCategoryByAlpha;
Intent broadcastIntent = new Intent(AstridApiConstants.BROADCAST_SEND_FILTERS);
broadcastIntent.putExtra(AstridApiConstants.EXTRAS_ITEMS, list);
context.sendBroadcast(broadcastIntent, AstridApiConstants.PERMISSION_READ);
}
}

@ -7,12 +7,12 @@ import android.content.Context;
import com.todoroo.andlib.data.Property;
import com.todoroo.andlib.data.TodorooCursor;
import com.todoroo.andlib.data.Property.CountProperty;
import com.todoroo.andlib.data.sql.Criterion;
import com.todoroo.andlib.data.sql.Join;
import com.todoroo.andlib.data.sql.Order;
import com.todoroo.andlib.data.sql.Query;
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.dao.MetadataDao.MetadataCriteria;
import com.todoroo.astrid.model.Metadata;

@ -0,0 +1,24 @@
<?xml version="1.0" encoding="utf-8"?>
<!-- See the file "LICENSE" for the full license governing this code. -->
<resources>
<!-- Resources for built-in tag plug-in -->
<string name="tag_EOE_button">Add Tags</string>
<string name="tag_EOE_button_w_tags">Tags: %s</string>
<string name="tag_TLA_detail">Tags: %s</string>
<string name="tag_FEx_header">Tags</string>
<string name="tag_FEx_by_size">By Size</string>
<string name="tag_FEx_alpha">Alphabetical</string>
<!-- $T => tag, $C => count -->
<string name="tag_FEx_tag_w_size">$T ($C)</string>
<!-- %s => tag name -->
<string name="tag_FEx_name">Tagged \'%s\'</string>
<string name="tag_TEA_hint">Type In a Tag</string>
<string name="tag_TEA_title">Edit Tags</string>
</resources>

@ -279,7 +279,7 @@ public class FilterListActivity extends ExpandableListActivity {
shortcutIntent.setAction(Intent.ACTION_VIEW);
shortcutIntent.putExtra(TaskListActivity.TOKEN_SHORTCUT_TITLE, filter.title);
shortcutIntent.putExtra(TaskListActivity.TOKEN_SHORTCUT_SQL, filter.sqlQuery);
shortcutIntent.putExtra(TaskListActivity.TOKEN_SHORTCUT_NEW_TASK_SQL, filter.sqlForNewTasks);
shortcutIntent.putExtra(TaskListActivity.TOKEN_SHORTCUT_NEW_TASK_SQL, filter.valuesForNewTasks);
menuItem.setIntent(shortcutIntent);
}

@ -24,7 +24,7 @@ import android.os.Bundle;
import com.timsu.astrid.utilities.StartupReceiver;
import com.todoroo.andlib.service.ExceptionService.TodorooUncaughtExceptionHandler;
import com.todoroo.astrid.filters.FilterExposer;
import com.todoroo.astrid.filters.CoreFilterExposer;
/**
* HomeActivity is the primary activity for Astrid and determines which activity
@ -74,7 +74,7 @@ public class HomeActivity extends AstridActivity {
*/
private void performRedirection() {
Intent intent = new Intent(this, TaskListActivity.class);
intent.putExtra(TaskListActivity.TOKEN_FILTER, FilterExposer.buildInboxFilter(getResources()));
intent.putExtra(TaskListActivity.TOKEN_FILTER, CoreFilterExposer.buildInboxFilter(getResources()));
startActivity(intent);
finish();
}

@ -46,7 +46,7 @@ import com.todoroo.astrid.api.AstridApiConstants;
import com.todoroo.astrid.api.Filter;
import com.todoroo.astrid.api.TaskDetail;
import com.todoroo.astrid.dao.Database;
import com.todoroo.astrid.filters.FilterExposer;
import com.todoroo.astrid.filters.CoreFilterExposer;
import com.todoroo.astrid.model.Task;
import com.todoroo.astrid.service.AstridDependencyInjector;
import com.todoroo.astrid.service.TaskService;
@ -134,9 +134,9 @@ public class TaskListActivity extends ListActivity implements OnScrollListener {
filter = new Filter();
filter.sqlQuery = extras.getString(TOKEN_SHORTCUT_SQL);
filter.title = extras.getString(TOKEN_SHORTCUT_TITLE);
filter.sqlForNewTasks = extras.getString(TOKEN_SHORTCUT_NEW_TASK_SQL);
filter.valuesForNewTasks = extras.getString(TOKEN_SHORTCUT_NEW_TASK_SQL);
} else {
filter = FilterExposer.buildInboxFilter(getResources());
filter = CoreFilterExposer.buildInboxFilter(getResources());
}
database.openForWriting();

@ -59,7 +59,7 @@ public class TaskAdapter extends CursorAdapter {
Task.URGENCY,
Task.DUE_DATE,
Task.COMPLETION_DATE,
Task.HIDDEN_UNTIL,
Task.HIDE_UNTIL,
};
private static int[] IMPORTANCE_COLORS = null;
@ -201,7 +201,7 @@ public class TaskAdapter extends CursorAdapter {
// name
final TextView nameView = viewHolder.nameView; {
String nameValue = task.getValue(Task.TITLE);
int hiddenUntil = task.getValue(Task.HIDDEN_UNTIL);
int hiddenUntil = task.getValue(Task.HIDE_UNTIL);
if(hiddenUntil > DateUtilities.now())
nameValue = r.getString(R.string.TAd_hiddenFormat, nameValue);
nameView.setText(nameValue);

@ -10,11 +10,11 @@ import android.database.Cursor;
import com.todoroo.andlib.data.GenericDao;
import com.todoroo.andlib.data.Property;
import com.todoroo.andlib.data.TodorooCursor;
import com.todoroo.andlib.data.sql.Criterion;
import com.todoroo.andlib.data.sql.Join;
import com.todoroo.andlib.data.sql.Query;
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.Query;
import com.todoroo.astrid.model.Metadata;
import com.todoroo.astrid.model.Task;

@ -11,10 +11,10 @@ import android.content.Intent;
import com.todoroo.andlib.data.AbstractModel;
import com.todoroo.andlib.data.GenericDao;
import com.todoroo.andlib.data.sql.Criterion;
import com.todoroo.andlib.service.Autowired;
import com.todoroo.andlib.service.ContextManager;
import com.todoroo.andlib.service.DependencyInjectionService;
import com.todoroo.andlib.sql.Criterion;
import com.todoroo.andlib.utility.DateUtilities;
import com.todoroo.astrid.api.AstridApiConstants;
import com.todoroo.astrid.dao.MetadataDao.MetadataCriteria;
@ -59,8 +59,8 @@ public class TaskDao extends GenericDao<Task> {
}
/** Return tasks that are not hidden at given unixtime */
public static Criterion isVisible(int time) {
return Task.HIDDEN_UNTIL.lt(time);
public static Criterion isVisible(long time) {
return Task.HIDE_UNTIL.lt(time);
}
/** Returns tasks that have a due date */
@ -69,17 +69,17 @@ public class TaskDao extends GenericDao<Task> {
}
/** Returns tasks that are due before a certain unixtime */
public static Criterion dueBefore(int time) {
public static Criterion dueBefore(long time) {
return Criterion.and(Task.DUE_DATE.gt(0), Task.DUE_DATE.lt(time));
}
/** Returns tasks that are due after a certain unixtime */
public static Criterion dueAfter(int time) {
public static Criterion dueAfter(long time) {
return Task.DUE_DATE.gt(time);
}
/** Returns tasks completed before a given unixtime */
public static Criterion completedBefore(int time) {
public static Criterion completedBefore(long time) {
return Criterion.and(Task.COMPLETION_DATE.gt(0), Task.COMPLETION_DATE.lt(time));
}

@ -18,7 +18,6 @@ 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.utility.DateUtilities;
import com.todoroo.astrid.api.AstridContentProvider.AstridTask;
/**
* Data Model which represents a task users need to accomplish.
@ -27,7 +26,7 @@ import com.todoroo.astrid.api.AstridContentProvider.AstridTask;
*
*/
@SuppressWarnings("nls")
public class Task extends AbstractModel {
public final class Task extends AbstractModel {
// --- table
@ -37,43 +36,43 @@ public class Task extends AbstractModel {
/** ID */
public static final LongProperty ID = new LongProperty(
TABLE, AstridTask.ID);
TABLE, ID_PROPERTY_NAME);
/** Name of Task */
public static final StringProperty TITLE = new StringProperty(
TABLE, AstridTask.TITLE);
TABLE, "title");
/** Urgency of Task (see urgency flags) */
public static final IntegerProperty URGENCY = new IntegerProperty(
TABLE, AstridTask.URGENCY);
TABLE, "urgency");
/** Importance of Task (see importance flags) */
public static final IntegerProperty IMPORTANCE = new IntegerProperty(
TABLE, AstridTask.IMPORTANCE);
TABLE, "importance");
/** Unixtime Task is due, 0 if not set */
public static final IntegerProperty DUE_DATE = new IntegerProperty(
TABLE, AstridTask.DUE_DATE);
public static final LongProperty DUE_DATE = new LongProperty(
TABLE, "dyeDate");
/** Unixtime Task should be hidden until */
public static final IntegerProperty HIDDEN_UNTIL = new IntegerProperty(
TABLE, AstridTask.HIDDEN_UNTIL);
public static final LongProperty HIDE_UNTIL = new LongProperty(
TABLE, "hideUntil");
/** Unixtime Task was created */
public static final IntegerProperty CREATION_DATE = new IntegerProperty(
TABLE, AstridTask.CREATION_DATE);
public static final LongProperty CREATION_DATE = new LongProperty(
TABLE, "created");
/** Unixtime Task was last touched */
public static final IntegerProperty MODIFICATION_DATE = new IntegerProperty(
TABLE, AstridTask.MODIFICATION_DATE);
public static final LongProperty MODIFICATION_DATE = new LongProperty(
TABLE, "modified");
/** Unixtime Task was completed. 0 means active */
public static final IntegerProperty COMPLETION_DATE = new IntegerProperty(
TABLE, AstridTask.COMPLETION_DATE);
public static final LongProperty COMPLETION_DATE = new LongProperty(
TABLE, "completed");
/** Unixtime Task was deleted. 0 means active */
public static final IntegerProperty DELETION_DATE = new IntegerProperty(
TABLE, AstridTask.DELETION_DATE);
/** Unixtime Task was deleted. 0 means not deleted */
public static final LongProperty DELETION_DATE = new LongProperty(
TABLE, "deleted");
// --- for migration purposes from astrid 2 (eventually we will want to
// move these into the metadata table and treat them as plug-ins
@ -117,24 +116,24 @@ public class Task extends AbstractModel {
/** List of all properties for this model */
public static final Property<?>[] PROPERTIES = generateProperties(Task.class);
// --- urgency flags
// --- urgency settings
public static final int URGENCY_NONE = AstridTask.URGENCY_NONE;
public static final int URGENCY_TODAY = AstridTask.URGENCY_TODAY;
public static final int URGENCY_THIS_WEEK = AstridTask.URGENCY_THIS_WEEK;
public static final int URGENCY_THIS_MONTH = AstridTask.URGENCY_THIS_MONTH;
public static final int URGENCY_WITHIN_THREE_MONTHS = AstridTask.URGENCY_WITHIN_THREE_MONTHS;
public static final int URGENCY_WITHIN_SIX_MONTHS = AstridTask.URGENCY_WITHIN_SIX_MONTHS;
public static final int URGENCY_WITHIN_A_YEAR = AstridTask.URGENCY_WITHIN_A_YEAR;
public static final int URGENCY_SPECIFIC_DAY = AstridTask.URGENCY_SPECIFIC_DAY;
public static final int URGENCY_SPECIFIC_DAY_TIME = AstridTask.URGENCY_SPECIFIC_DAY_TIME;
public static final int URGENCY_NONE = 0;
public static final int URGENCY_TODAY = 1;
public static final int URGENCY_THIS_WEEK = 2;
public static final int URGENCY_THIS_MONTH = 3;
public static final int URGENCY_WITHIN_THREE_MONTHS = 4;
public static final int URGENCY_WITHIN_SIX_MONTHS = 5;
public static final int URGENCY_WITHIN_A_YEAR = 6;
public static final int URGENCY_SPECIFIC_DAY = 7;
public static final int URGENCY_SPECIFIC_DAY_TIME = 8;
// --- importance flags
// --- importance settings
public static final int IMPORTANCE_DO_OR_DIE = AstridTask.IMPORTANCE_DO_OR_DIE;
public static final int IMPORTANCE_MUST_DO = AstridTask.IMPORTANCE_MUST_DO;
public static final int IMPORTANCE_SHOULD_DO = AstridTask.IMPORTANCE_SHOULD_DO;
public static final int IMPORTANCE_NONE = AstridTask.IMPORTANCE_NONE;
public static final int IMPORTANCE_DO_OR_DIE = 0;
public static final int IMPORTANCE_MUST_DO = 1;
public static final int IMPORTANCE_SHOULD_DO = 2;
public static final int IMPORTANCE_NONE = 3;
// --- defaults
@ -144,7 +143,7 @@ public class Task extends AbstractModel {
static {
defaultValues.put(TITLE.name, "");
defaultValues.put(DUE_DATE.name, 0);
defaultValues.put(HIDDEN_UNTIL.name, 0);
defaultValues.put(HIDE_UNTIL.name, 0);
defaultValues.put(COMPLETION_DATE.name, 0);
defaultValues.put(DELETION_DATE.name, 0);
defaultValues.put(URGENCY.name, URGENCY_NONE);
@ -225,7 +224,7 @@ public class Task extends AbstractModel {
/** Checks whether task is hidden. Requires HIDDEN_UNTIL */
public boolean isHidden() {
return getValue(HIDDEN_UNTIL) > DateUtilities.now();
return getValue(HIDE_UNTIL) > DateUtilities.now();
}
/** Checks whether task is done. Requires DUE_DATE */

@ -105,7 +105,7 @@ public class Astrid2To3UpgradeHelper {
propertyMap.put(AbstractTaskModel.TIMER_START, Task.TIMER_START);
propertyMap.put(AbstractTaskModel.DEFINITE_DUE_DATE, Task.DUE_DATE);
propertyMap.put(AbstractTaskModel.PREFERRED_DUE_DATE, Task.PREFERRED_DUE_DATE);
propertyMap.put(AbstractTaskModel.HIDDEN_UNTIL, Task.HIDDEN_UNTIL);
propertyMap.put(AbstractTaskModel.HIDDEN_UNTIL, Task.HIDE_UNTIL);
propertyMap.put(AbstractTaskModel.POSTPONE_COUNT, Task.POSTPONE_COUNT);
propertyMap.put(AbstractTaskModel.NOTIFICATIONS, Task.NOTIFICATIONS);
propertyMap.put(AbstractTaskModel.NOTIFICATION_FLAGS, Task.NOTIFICATION_FLAGS);
@ -172,7 +172,7 @@ public class Astrid2To3UpgradeHelper {
property == Task.CREATION_DATE ||
property == Task.DELETION_DATE ||
property == Task.DUE_DATE ||
property == Task.HIDDEN_UNTIL ||
property == Task.HIDE_UNTIL ||
property == Task.LAST_NOTIFIED ||
property == Task.MODIFICATION_DATE ||
property == Task.PREFERRED_DUE_DATE ||

@ -3,11 +3,11 @@ package com.todoroo.astrid.service;
import com.todoroo.andlib.data.Property;
import com.todoroo.andlib.data.TodorooCursor;
import com.todoroo.andlib.data.Property.CountProperty;
import com.todoroo.andlib.data.sql.Criterion;
import com.todoroo.andlib.data.sql.Order;
import com.todoroo.andlib.data.sql.Query;
import com.todoroo.andlib.service.Autowired;
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.dao.MetadataDao;
import com.todoroo.astrid.model.Metadata;

@ -2,9 +2,9 @@ package com.todoroo.astrid.service;
import com.todoroo.andlib.data.Property;
import com.todoroo.andlib.data.TodorooCursor;
import com.todoroo.andlib.data.sql.Query;
import com.todoroo.andlib.service.Autowired;
import com.todoroo.andlib.service.DependencyInjectionService;
import com.todoroo.andlib.sql.Query;
import com.todoroo.andlib.utility.DateUtilities;
import com.todoroo.astrid.api.Filter;
import com.todoroo.astrid.dao.TaskDao;

@ -2,8 +2,8 @@ package com.todoroo.astrid.dao;
import com.todoroo.andlib.data.Property;
import com.todoroo.andlib.data.TodorooCursor;
import com.todoroo.andlib.data.sql.Query;
import com.todoroo.andlib.service.Autowired;
import com.todoroo.andlib.sql.Query;
import com.todoroo.astrid.dao.MetadataDao.MetadataCriteria;
import com.todoroo.astrid.model.Metadata;
import com.todoroo.astrid.model.Task;

@ -2,9 +2,9 @@ package com.todoroo.astrid.dao;
import com.todoroo.andlib.data.Property;
import com.todoroo.andlib.data.TodorooCursor;
import com.todoroo.andlib.data.sql.Order;
import com.todoroo.andlib.data.sql.Query;
import com.todoroo.andlib.service.Autowired;
import com.todoroo.andlib.sql.Order;
import com.todoroo.andlib.sql.Query;
import com.todoroo.andlib.utility.DateUtilities;
import com.todoroo.astrid.dao.TaskDao.TaskCriteria;
import com.todoroo.astrid.model.Task;
@ -85,7 +85,7 @@ public class TaskDaoTests extends DatabaseTestCase {
// create hidden task
task = new Task();
task.setValue(Task.TITLE, "hidden");
task.setValue(Task.HIDDEN_UNTIL, DateUtilities.now() + 10000);
task.setValue(Task.HIDE_UNTIL, DateUtilities.now() + 10000);
assertTrue(taskDao.save(task, false));
// create task with deadlines

@ -44,7 +44,7 @@ public class TaskTests extends DatabaseTestCase {
ContentValues defaults = new Task().getDefaultValues();
assertTrue(defaults.containsKey(Task.TITLE.name));
assertTrue(defaults.containsKey(Task.DUE_DATE.name));
assertTrue(defaults.containsKey(Task.HIDDEN_UNTIL.name));
assertTrue(defaults.containsKey(Task.HIDE_UNTIL.name));
assertTrue(defaults.containsKey(Task.COMPLETION_DATE.name));
assertTrue(defaults.containsKey(Task.URGENCY.name));
assertTrue(defaults.containsKey(Task.IMPORTANCE.name));
@ -68,7 +68,7 @@ public class TaskTests extends DatabaseTestCase {
task = new Task();
assertFalse(task.isHidden());
task.setValue(Task.HIDDEN_UNTIL, DateUtilities.now() + 1000);
task.setValue(Task.HIDE_UNTIL, DateUtilities.now() + 1000);
assertTrue(task.isHidden());
task = new Task();

@ -3,8 +3,8 @@ package com.todoroo.astrid.upgrade;
import java.util.Date;
import com.todoroo.andlib.data.TodorooCursor;
import com.todoroo.andlib.data.sql.Query;
import com.todoroo.andlib.service.Autowired;
import com.todoroo.andlib.sql.Query;
import com.todoroo.astrid.alarms.Alarm;
import com.todoroo.astrid.dao.TaskDao;
import com.todoroo.astrid.legacy.data.alerts.AlertController;
@ -100,14 +100,14 @@ public class Astrid2To3UpgradeTests extends DatabaseTestCase {
assertEquals(griffey.getEstimatedSeconds(), task.getValue(Task.ESTIMATED_SECONDS));
assertEquals(griffey.getNotes(), task.getValue(Task.NOTES));
assertEquals((Integer)0, task.getValue(Task.LAST_NOTIFIED));
assertEquals((Integer)0, task.getValue(Task.HIDDEN_UNTIL));
assertEquals((Integer)0, task.getValue(Task.HIDE_UNTIL));
tasks.moveToNext();
task = new Task(tasks);
assertEquals(guti.getName(), task.getValue(Task.TITLE));
assertDatesEqual(guti.getDefiniteDueDate(), task.getValue(Task.DUE_DATE));
assertDatesEqual(guti.getPreferredDueDate(), task.getValue(Task.PREFERRED_DUE_DATE));
assertDatesEqual(guti.getHiddenUntil(), task.getValue(Task.HIDDEN_UNTIL));
assertDatesEqual(guti.getHiddenUntil(), task.getValue(Task.HIDE_UNTIL));
assertEquals((Integer)Task.IMPORTANCE_DO_OR_DIE, task.getValue(Task.IMPORTANCE));
assertEquals(guti.getRepeat().getValue(), task.getRepeatInfo().getValue());
assertEquals(guti.getRepeat().getInterval().ordinal(), task.getRepeatInfo().getInterval().ordinal());

Loading…
Cancel
Save