From 76b85c3efe52bc12dae29495194debef465792db Mon Sep 17 00:00:00 2001 From: Tim Su Date: Wed, 11 Aug 2010 17:58:51 -0700 Subject: [PATCH 1/7] trying out new icon things in details --- .../com/todoroo/andlib/sql/Criterion.java | 178 ++--- .../com/todoroo/andlib/sql/DBObject.java | 134 ++-- .../com/todoroo/andlib/sql/EqCriterion.java | 14 +- .../com/todoroo/andlib/sql/Field.java | 190 +++--- .../com/todoroo/andlib/sql/GroupBy.java | 28 +- .../com/todoroo/andlib/sql/Join.java | 86 +-- .../com/todoroo/andlib/sql/JoinType.java | 10 +- .../com/todoroo/andlib/sql/Operator.java | 114 ++-- .../com/todoroo/andlib/sql/OrderType.java | 10 +- .../com/todoroo/andlib/sql/Query.java | 410 ++++++------ .../com/todoroo/andlib/sql/QueryTemplate.java | 234 +++---- .../com/todoroo/andlib/sql/SqlConstants.java | 50 +- .../com/todoroo/andlib/sql/SqlTable.java | 40 +- .../todoroo/andlib/sql/UnaryCriterion.java | 214 +++---- .../com/todoroo/astrid/gcal/Calendars.java | 290 ++++----- .../astrid/notes/NoteDetailExposer.java | 2 +- .../producteev/ProducteevDetailExposer.java | 7 +- .../reminders/NotificationActivity.java | 298 ++++----- .../astrid/repeats/RepeatDetailExposer.java | 2 +- .../astrid/rmilk/MilkBackgroundService.java | 256 ++++---- .../astrid/rmilk/MilkDetailExposer.java | 5 +- .../astrid/rmilk/api/data/RtmTaskNote.java | 212 +++--- .../todoroo/astrid/tags/TagDetailExposer.java | 3 +- astrid/res/drawable/ic_menu_rmilk.png | Bin 2656 -> 0 bytes astrid/res/drawable/silk_date.png | Bin 0 -> 626 bytes astrid/res/drawable/silk_folder.png | Bin 0 -> 555 bytes astrid/res/drawable/silk_note.png | Bin 0 -> 518 bytes astrid/res/drawable/silk_script.png | Bin 0 -> 778 bytes astrid/res/drawable/silk_tag_pink.png | Bin 0 -> 715 bytes astrid/res/drawable/silk_user_gray.png | Bin 0 -> 778 bytes astrid/res/layout/addon_activity.xml | 98 +-- astrid/res/layout/task_edit_activity.xml | 606 +++++++++--------- astrid/res/values/strings-repeat.xml | 4 +- astrid/res/values/strings-tags.xml | 5 - .../com/timsu/astrid/activities/TaskList.java | 126 ++-- .../astrid/activity/ShortcutActivity.java | 288 ++++----- .../todoroo/astrid/adapter/TaskAdapter.java | 17 +- .../astrid/provider/Astrid2TaskProvider.java | 578 ++++++++--------- .../todoroo/astrid/service/AddOnService.java | 2 +- 39 files changed, 2258 insertions(+), 2253 deletions(-) delete mode 100644 astrid/res/drawable/ic_menu_rmilk.png create mode 100644 astrid/res/drawable/silk_date.png create mode 100644 astrid/res/drawable/silk_folder.png create mode 100644 astrid/res/drawable/silk_note.png create mode 100644 astrid/res/drawable/silk_script.png create mode 100644 astrid/res/drawable/silk_tag_pink.png create mode 100644 astrid/res/drawable/silk_user_gray.png diff --git a/astrid/common-src/com/todoroo/andlib/sql/Criterion.java b/astrid/common-src/com/todoroo/andlib/sql/Criterion.java index a208f6db4..5acdc6535 100644 --- a/astrid/common-src/com/todoroo/andlib/sql/Criterion.java +++ b/astrid/common-src/com/todoroo/andlib/sql/Criterion.java @@ -1,89 +1,89 @@ -package com.todoroo.andlib.sql; - -import static com.todoroo.andlib.sql.SqlConstants.AND; -import static com.todoroo.andlib.sql.SqlConstants.EXISTS; -import static com.todoroo.andlib.sql.SqlConstants.LEFT_PARENTHESIS; -import static com.todoroo.andlib.sql.SqlConstants.NOT; -import static com.todoroo.andlib.sql.SqlConstants.OR; -import static com.todoroo.andlib.sql.SqlConstants.RIGHT_PARENTHESIS; -import static com.todoroo.andlib.sql.SqlConstants.SPACE; - -public abstract class Criterion { - protected final Operator operator; - - Criterion(Operator operator) { - this.operator = operator; - } - - public static Criterion all = new Criterion(Operator.exists) { - @Override - protected void populate(StringBuilder sb) { - sb.append(1); - } - }; - - public static Criterion none = new Criterion(Operator.exists) { - @Override - protected void populate(StringBuilder sb) { - sb.append(0); - } - }; - - public static Criterion and(final Criterion criterion, final Criterion... criterions) { - return new Criterion(Operator.and) { - - @Override - protected void populate(StringBuilder sb) { - sb.append(criterion); - for (Criterion c : criterions) { - sb.append(SPACE).append(AND).append(SPACE).append(c); - } - } - }; - } - - public static Criterion or(final Criterion criterion, final Criterion... criterions) { - return new Criterion(Operator.or) { - - @Override - protected void populate(StringBuilder sb) { - sb.append(criterion); - for (Criterion c : criterions) { - sb.append(SPACE).append(OR).append(SPACE).append(c.toString()); - } - } - }; - } - - public static Criterion exists(final Query query) { - return new Criterion(Operator.exists) { - - @Override - protected void populate(StringBuilder sb) { - sb.append(EXISTS).append(SPACE).append(LEFT_PARENTHESIS).append(query).append(RIGHT_PARENTHESIS); - } - }; - } - - public static Criterion not(final Criterion criterion) { - return new Criterion(Operator.not) { - - @Override - protected void populate(StringBuilder sb) { - sb.append(NOT).append(SPACE); - criterion.populate(sb); - } - }; - } - - protected abstract void populate(StringBuilder sb); - - @Override - public String toString() { - StringBuilder builder = new StringBuilder(LEFT_PARENTHESIS); - populate(builder); - builder.append(RIGHT_PARENTHESIS); - return builder.toString(); - } - -} +package com.todoroo.andlib.sql; + +import static com.todoroo.andlib.sql.SqlConstants.AND; +import static com.todoroo.andlib.sql.SqlConstants.EXISTS; +import static com.todoroo.andlib.sql.SqlConstants.LEFT_PARENTHESIS; +import static com.todoroo.andlib.sql.SqlConstants.NOT; +import static com.todoroo.andlib.sql.SqlConstants.OR; +import static com.todoroo.andlib.sql.SqlConstants.RIGHT_PARENTHESIS; +import static com.todoroo.andlib.sql.SqlConstants.SPACE; + +public abstract class Criterion { + protected final Operator operator; + + Criterion(Operator operator) { + this.operator = operator; + } + + public static Criterion all = new Criterion(Operator.exists) { + @Override + protected void populate(StringBuilder sb) { + sb.append(1); + } + }; + + public static Criterion none = new Criterion(Operator.exists) { + @Override + protected void populate(StringBuilder sb) { + sb.append(0); + } + }; + + public static Criterion and(final Criterion criterion, final Criterion... criterions) { + return new Criterion(Operator.and) { + + @Override + protected void populate(StringBuilder sb) { + sb.append(criterion); + for (Criterion c : criterions) { + sb.append(SPACE).append(AND).append(SPACE).append(c); + } + } + }; + } + + public static Criterion or(final Criterion criterion, final Criterion... criterions) { + return new Criterion(Operator.or) { + + @Override + protected void populate(StringBuilder sb) { + sb.append(criterion); + for (Criterion c : criterions) { + sb.append(SPACE).append(OR).append(SPACE).append(c.toString()); + } + } + }; + } + + public static Criterion exists(final Query query) { + return new Criterion(Operator.exists) { + + @Override + protected void populate(StringBuilder sb) { + sb.append(EXISTS).append(SPACE).append(LEFT_PARENTHESIS).append(query).append(RIGHT_PARENTHESIS); + } + }; + } + + public static Criterion not(final Criterion criterion) { + return new Criterion(Operator.not) { + + @Override + protected void populate(StringBuilder sb) { + sb.append(NOT).append(SPACE); + criterion.populate(sb); + } + }; + } + + protected abstract void populate(StringBuilder sb); + + @Override + public String toString() { + StringBuilder builder = new StringBuilder(LEFT_PARENTHESIS); + populate(builder); + builder.append(RIGHT_PARENTHESIS); + return builder.toString(); + } + +} diff --git a/astrid/common-src/com/todoroo/andlib/sql/DBObject.java b/astrid/common-src/com/todoroo/andlib/sql/DBObject.java index 3e4c9a29f..b29c6550b 100644 --- a/astrid/common-src/com/todoroo/andlib/sql/DBObject.java +++ b/astrid/common-src/com/todoroo/andlib/sql/DBObject.java @@ -1,67 +1,67 @@ -package com.todoroo.andlib.sql; - -import static com.todoroo.andlib.sql.SqlConstants.AS; -import static com.todoroo.andlib.sql.SqlConstants.SPACE; - -public abstract class DBObject> implements Cloneable { - protected String alias; - protected final String expression; - - protected DBObject(String expression){ - this.expression = expression; - } - - public T as(String newAlias) { - try { - T clone = (T) clone(); - clone.alias = newAlias; - return clone; - } catch (CloneNotSupportedException e) { - throw new RuntimeException(e); - } - } - - public boolean hasAlias() { - return alias != null; - } - - @Override - public boolean equals(Object o) { - if (this == o) return true; - if (o == null || getClass() != o.getClass()) return false; - - DBObject dbObject = (DBObject) o; - - if (alias != null ? !alias.equals(dbObject.alias) : dbObject.alias != null) return false; - if (expression != null ? !expression.equals(dbObject.expression) : dbObject.expression != null) return false; - - return true; - } - - @Override - public int hashCode() { - int result = alias != null ? alias.hashCode() : 0; - result = 31 * result + (expression != null ? expression.hashCode() : 0); - return result; - } - - @Override - public final String toString() { - if (hasAlias()) { - return alias; - } - return expression; - } - - public final String toStringInSelect() { - StringBuilder sb = new StringBuilder(expression); - if (hasAlias()) { - sb.append(SPACE).append(AS).append(SPACE).append(alias); - } else { - int pos = expression.indexOf('.'); - if(pos > 0) - sb.append(SPACE).append(AS).append(SPACE).append(expression.substring(pos + 1)); - } - return sb.toString(); - } -} +package com.todoroo.andlib.sql; + +import static com.todoroo.andlib.sql.SqlConstants.AS; +import static com.todoroo.andlib.sql.SqlConstants.SPACE; + +public abstract class DBObject> implements Cloneable { + protected String alias; + protected final String expression; + + protected DBObject(String expression){ + this.expression = expression; + } + + public T as(String newAlias) { + try { + T clone = (T) clone(); + clone.alias = newAlias; + return clone; + } catch (CloneNotSupportedException e) { + throw new RuntimeException(e); + } + } + + public boolean hasAlias() { + return alias != null; + } + + @Override + public boolean equals(Object o) { + if (this == o) return true; + if (o == null || getClass() != o.getClass()) return false; + + DBObject dbObject = (DBObject) o; + + if (alias != null ? !alias.equals(dbObject.alias) : dbObject.alias != null) return false; + if (expression != null ? !expression.equals(dbObject.expression) : dbObject.expression != null) return false; + + return true; + } + + @Override + public int hashCode() { + int result = alias != null ? alias.hashCode() : 0; + result = 31 * result + (expression != null ? expression.hashCode() : 0); + return result; + } + + @Override + public final String toString() { + if (hasAlias()) { + return alias; + } + return expression; + } + + public final String toStringInSelect() { + StringBuilder sb = new StringBuilder(expression); + if (hasAlias()) { + sb.append(SPACE).append(AS).append(SPACE).append(alias); + } else { + int pos = expression.indexOf('.'); + if(pos > 0) + sb.append(SPACE).append(AS).append(SPACE).append(expression.substring(pos + 1)); + } + return sb.toString(); + } +} diff --git a/astrid/common-src/com/todoroo/andlib/sql/EqCriterion.java b/astrid/common-src/com/todoroo/andlib/sql/EqCriterion.java index 99fc74ad2..8873069cb 100644 --- a/astrid/common-src/com/todoroo/andlib/sql/EqCriterion.java +++ b/astrid/common-src/com/todoroo/andlib/sql/EqCriterion.java @@ -1,7 +1,7 @@ -package com.todoroo.andlib.sql; - -public class EqCriterion extends UnaryCriterion { - EqCriterion(Field field, Object value) { - super(field, Operator.eq, value); - } -} +package com.todoroo.andlib.sql; + +public class EqCriterion extends UnaryCriterion { + EqCriterion(Field field, Object value) { + super(field, Operator.eq, value); + } +} diff --git a/astrid/common-src/com/todoroo/andlib/sql/Field.java b/astrid/common-src/com/todoroo/andlib/sql/Field.java index c2989f80c..e967eb664 100644 --- a/astrid/common-src/com/todoroo/andlib/sql/Field.java +++ b/astrid/common-src/com/todoroo/andlib/sql/Field.java @@ -1,95 +1,95 @@ -package com.todoroo.andlib.sql; - -import static com.todoroo.andlib.sql.SqlConstants.AND; -import static com.todoroo.andlib.sql.SqlConstants.BETWEEN; -import static com.todoroo.andlib.sql.SqlConstants.COMMA; -import static com.todoroo.andlib.sql.SqlConstants.LEFT_PARENTHESIS; -import static com.todoroo.andlib.sql.SqlConstants.RIGHT_PARENTHESIS; -import static com.todoroo.andlib.sql.SqlConstants.SPACE; - -public class Field extends DBObject { - - protected Field(String expression) { - super(expression); - } - - public static Field field(String expression) { - return new Field(expression); - } - - public Criterion eq(Object value) { - if(value == null) - return UnaryCriterion.isNull(this); - return UnaryCriterion.eq(this, value); - } - - public Criterion neq(Object value) { - if(value == null) - return UnaryCriterion.isNotNull(this); - return UnaryCriterion.neq(this, value); - } - - public Criterion gt(Object value) { - return UnaryCriterion.gt(this, value); - } - - public Criterion lt(final Object value) { - return UnaryCriterion.lt(this, value); - } - - public Criterion isNull() { - return UnaryCriterion.isNull(this); - } - - public Criterion isNotNull() { - return UnaryCriterion.isNotNull(this); - } - - public Criterion between(final Object lower, final Object upper) { - final Field field = this; - return new Criterion(null) { - - @Override - protected void populate(StringBuilder sb) { - sb.append(field).append(SPACE).append(BETWEEN).append(SPACE).append(lower).append(SPACE).append(AND) - .append(SPACE).append(upper); - } - }; - } - - public Criterion like(final String value) { - return UnaryCriterion.like(this, value); - } - - public Criterion like(String value, String escape) { - return UnaryCriterion.like(this, value, escape); - } - - - public Criterion in(final T... value) { - final Field field = this; - return new Criterion(Operator.in) { - - @Override - protected void populate(StringBuilder sb) { - sb.append(field).append(SPACE).append(Operator.in).append(SPACE).append(LEFT_PARENTHESIS); - for (T t : value) { - sb.append(t.toString()).append(COMMA); - } - sb.deleteCharAt(sb.length() - 1).append(RIGHT_PARENTHESIS); - } - }; - } - - public Criterion in(final Query query) { - final Field field = this; - return new Criterion(Operator.in) { - - @Override - protected void populate(StringBuilder sb) { - sb.append(field).append(SPACE).append(Operator.in).append(SPACE).append(LEFT_PARENTHESIS).append(query) - .append(RIGHT_PARENTHESIS); - } - }; - } -} +package com.todoroo.andlib.sql; + +import static com.todoroo.andlib.sql.SqlConstants.AND; +import static com.todoroo.andlib.sql.SqlConstants.BETWEEN; +import static com.todoroo.andlib.sql.SqlConstants.COMMA; +import static com.todoroo.andlib.sql.SqlConstants.LEFT_PARENTHESIS; +import static com.todoroo.andlib.sql.SqlConstants.RIGHT_PARENTHESIS; +import static com.todoroo.andlib.sql.SqlConstants.SPACE; + +public class Field extends DBObject { + + protected Field(String expression) { + super(expression); + } + + public static Field field(String expression) { + return new Field(expression); + } + + public Criterion eq(Object value) { + if(value == null) + return UnaryCriterion.isNull(this); + return UnaryCriterion.eq(this, value); + } + + public Criterion neq(Object value) { + if(value == null) + return UnaryCriterion.isNotNull(this); + return UnaryCriterion.neq(this, value); + } + + public Criterion gt(Object value) { + return UnaryCriterion.gt(this, value); + } + + public Criterion lt(final Object value) { + return UnaryCriterion.lt(this, value); + } + + public Criterion isNull() { + return UnaryCriterion.isNull(this); + } + + public Criterion isNotNull() { + return UnaryCriterion.isNotNull(this); + } + + public Criterion between(final Object lower, final Object upper) { + final Field field = this; + return new Criterion(null) { + + @Override + protected void populate(StringBuilder sb) { + sb.append(field).append(SPACE).append(BETWEEN).append(SPACE).append(lower).append(SPACE).append(AND) + .append(SPACE).append(upper); + } + }; + } + + public Criterion like(final String value) { + return UnaryCriterion.like(this, value); + } + + public Criterion like(String value, String escape) { + return UnaryCriterion.like(this, value, escape); + } + + + public Criterion in(final T... value) { + final Field field = this; + return new Criterion(Operator.in) { + + @Override + protected void populate(StringBuilder sb) { + sb.append(field).append(SPACE).append(Operator.in).append(SPACE).append(LEFT_PARENTHESIS); + for (T t : value) { + sb.append(t.toString()).append(COMMA); + } + sb.deleteCharAt(sb.length() - 1).append(RIGHT_PARENTHESIS); + } + }; + } + + public Criterion in(final Query query) { + final Field field = this; + return new Criterion(Operator.in) { + + @Override + protected void populate(StringBuilder sb) { + sb.append(field).append(SPACE).append(Operator.in).append(SPACE).append(LEFT_PARENTHESIS).append(query) + .append(RIGHT_PARENTHESIS); + } + }; + } +} diff --git a/astrid/common-src/com/todoroo/andlib/sql/GroupBy.java b/astrid/common-src/com/todoroo/andlib/sql/GroupBy.java index 65f765c27..df8c19df9 100644 --- a/astrid/common-src/com/todoroo/andlib/sql/GroupBy.java +++ b/astrid/common-src/com/todoroo/andlib/sql/GroupBy.java @@ -1,14 +1,14 @@ -package com.todoroo.andlib.sql; - -import java.util.ArrayList; -import java.util.List; - -public class GroupBy { - private List fields = new ArrayList(); - - public static GroupBy groupBy(Field field) { - GroupBy groupBy = new GroupBy(); - groupBy.fields.add(field); - return groupBy; - } -} +package com.todoroo.andlib.sql; + +import java.util.ArrayList; +import java.util.List; + +public class GroupBy { + private List fields = new ArrayList(); + + public static GroupBy groupBy(Field field) { + GroupBy groupBy = new GroupBy(); + groupBy.fields.add(field); + return groupBy; + } +} diff --git a/astrid/common-src/com/todoroo/andlib/sql/Join.java b/astrid/common-src/com/todoroo/andlib/sql/Join.java index 646ca8cc5..ac8a479f2 100644 --- a/astrid/common-src/com/todoroo/andlib/sql/Join.java +++ b/astrid/common-src/com/todoroo/andlib/sql/Join.java @@ -1,43 +1,43 @@ -package com.todoroo.andlib.sql; - -import static com.todoroo.andlib.sql.SqlConstants.JOIN; -import static com.todoroo.andlib.sql.SqlConstants.ON; -import static com.todoroo.andlib.sql.SqlConstants.SPACE; - -public class Join { - private final SqlTable joinTable; - private final JoinType joinType; - private final Criterion[] criterions; - - private Join(SqlTable table, JoinType joinType, Criterion... criterions) { - joinTable = table; - this.joinType = joinType; - this.criterions = criterions; - } - - public static Join inner(SqlTable expression, Criterion... criterions) { - return new Join(expression, JoinType.INNER, criterions); - } - - public static Join left(SqlTable table, Criterion... criterions) { - return new Join(table, JoinType.LEFT, criterions); - } - - public static Join right(SqlTable table, Criterion... criterions) { - return new Join(table, JoinType.RIGHT, criterions); - } - - public static Join out(SqlTable table, Criterion... criterions) { - return new Join(table, JoinType.OUT, criterions); - } - - @Override - public String toString() { - StringBuilder sb = new StringBuilder(); - sb.append(joinType).append(SPACE).append(JOIN).append(SPACE).append(joinTable).append(SPACE).append(ON); - for (Criterion criterion : criterions) { - sb.append(SPACE).append(criterion); - } - return sb.toString(); - } -} +package com.todoroo.andlib.sql; + +import static com.todoroo.andlib.sql.SqlConstants.JOIN; +import static com.todoroo.andlib.sql.SqlConstants.ON; +import static com.todoroo.andlib.sql.SqlConstants.SPACE; + +public class Join { + private final SqlTable joinTable; + private final JoinType joinType; + private final Criterion[] criterions; + + private Join(SqlTable table, JoinType joinType, Criterion... criterions) { + joinTable = table; + this.joinType = joinType; + this.criterions = criterions; + } + + public static Join inner(SqlTable expression, Criterion... criterions) { + return new Join(expression, JoinType.INNER, criterions); + } + + public static Join left(SqlTable table, Criterion... criterions) { + return new Join(table, JoinType.LEFT, criterions); + } + + public static Join right(SqlTable table, Criterion... criterions) { + return new Join(table, JoinType.RIGHT, criterions); + } + + public static Join out(SqlTable table, Criterion... criterions) { + return new Join(table, JoinType.OUT, criterions); + } + + @Override + public String toString() { + StringBuilder sb = new StringBuilder(); + sb.append(joinType).append(SPACE).append(JOIN).append(SPACE).append(joinTable).append(SPACE).append(ON); + for (Criterion criterion : criterions) { + sb.append(SPACE).append(criterion); + } + return sb.toString(); + } +} diff --git a/astrid/common-src/com/todoroo/andlib/sql/JoinType.java b/astrid/common-src/com/todoroo/andlib/sql/JoinType.java index c1cb7389b..84e632b53 100644 --- a/astrid/common-src/com/todoroo/andlib/sql/JoinType.java +++ b/astrid/common-src/com/todoroo/andlib/sql/JoinType.java @@ -1,5 +1,5 @@ -package com.todoroo.andlib.sql; - -public enum JoinType { - INNER, LEFT, RIGHT, OUT -} +package com.todoroo.andlib.sql; + +public enum JoinType { + INNER, LEFT, RIGHT, OUT +} diff --git a/astrid/common-src/com/todoroo/andlib/sql/Operator.java b/astrid/common-src/com/todoroo/andlib/sql/Operator.java index 414b5d271..5581987d4 100644 --- a/astrid/common-src/com/todoroo/andlib/sql/Operator.java +++ b/astrid/common-src/com/todoroo/andlib/sql/Operator.java @@ -1,57 +1,57 @@ -package com.todoroo.andlib.sql; - -import static com.todoroo.andlib.sql.SqlConstants.SPACE; - -import java.util.HashMap; -import java.util.Map; - -@SuppressWarnings("nls") -public final class Operator { - - private final String operator; - public static final Operator eq = new Operator("="); - public static final Operator neq = new Operator("<>"); - public static final Operator isNull = new Operator("IS NULL"); - public static final Operator isNotNull = new Operator("IS NOT NULL"); - public static final Operator gt = new Operator(">"); - public static final Operator lt = new Operator("<"); - public static final Operator gte = new Operator(">="); - public static final Operator lte = new Operator("<="); - public static final Operator and = new Operator("AND"); - public static final Operator or = new Operator("OR"); - public static final Operator not = new Operator("NOT"); - public static final Operator exists = new Operator("EXISTS"); - public static final Operator like = new Operator("LIKE"); - public static final Operator in = new Operator("IN"); - - private static final Map contraryRegistry = new HashMap(); - - static { - contraryRegistry.put(eq, neq); - contraryRegistry.put(neq, eq); - contraryRegistry.put(isNull, isNotNull); - contraryRegistry.put(isNotNull, isNull); - contraryRegistry.put(gt, lte); - contraryRegistry.put(lte, gt); - contraryRegistry.put(lt, gte); - contraryRegistry.put(gte, lt); - } - - private Operator(String operator) { - this.operator = operator; - } - - public Operator getContrary() { - if(!contraryRegistry.containsKey(this)){ - Operator opposite = new Operator(not.toString() + SPACE + this.toString()); - contraryRegistry.put(this, opposite); - contraryRegistry.put(opposite, this); - } - return contraryRegistry.get(this); - } - - @Override - public String toString() { - return this.operator.toString(); - } -} +package com.todoroo.andlib.sql; + +import static com.todoroo.andlib.sql.SqlConstants.SPACE; + +import java.util.HashMap; +import java.util.Map; + +@SuppressWarnings("nls") +public final class Operator { + + private final String operator; + public static final Operator eq = new Operator("="); + public static final Operator neq = new Operator("<>"); + public static final Operator isNull = new Operator("IS NULL"); + public static final Operator isNotNull = new Operator("IS NOT NULL"); + public static final Operator gt = new Operator(">"); + public static final Operator lt = new Operator("<"); + public static final Operator gte = new Operator(">="); + public static final Operator lte = new Operator("<="); + public static final Operator and = new Operator("AND"); + public static final Operator or = new Operator("OR"); + public static final Operator not = new Operator("NOT"); + public static final Operator exists = new Operator("EXISTS"); + public static final Operator like = new Operator("LIKE"); + public static final Operator in = new Operator("IN"); + + private static final Map contraryRegistry = new HashMap(); + + static { + contraryRegistry.put(eq, neq); + contraryRegistry.put(neq, eq); + contraryRegistry.put(isNull, isNotNull); + contraryRegistry.put(isNotNull, isNull); + contraryRegistry.put(gt, lte); + contraryRegistry.put(lte, gt); + contraryRegistry.put(lt, gte); + contraryRegistry.put(gte, lt); + } + + private Operator(String operator) { + this.operator = operator; + } + + public Operator getContrary() { + if(!contraryRegistry.containsKey(this)){ + Operator opposite = new Operator(not.toString() + SPACE + this.toString()); + contraryRegistry.put(this, opposite); + contraryRegistry.put(opposite, this); + } + return contraryRegistry.get(this); + } + + @Override + public String toString() { + return this.operator.toString(); + } +} diff --git a/astrid/common-src/com/todoroo/andlib/sql/OrderType.java b/astrid/common-src/com/todoroo/andlib/sql/OrderType.java index 299c670c0..d84742e28 100644 --- a/astrid/common-src/com/todoroo/andlib/sql/OrderType.java +++ b/astrid/common-src/com/todoroo/andlib/sql/OrderType.java @@ -1,5 +1,5 @@ -package com.todoroo.andlib.sql; - -public enum OrderType { - DESC, ASC -} +package com.todoroo.andlib.sql; + +public enum OrderType { + DESC, ASC +} diff --git a/astrid/common-src/com/todoroo/andlib/sql/Query.java b/astrid/common-src/com/todoroo/andlib/sql/Query.java index 7cc16c459..b0a612def 100644 --- a/astrid/common-src/com/todoroo/andlib/sql/Query.java +++ b/astrid/common-src/com/todoroo/andlib/sql/Query.java @@ -1,205 +1,205 @@ -package com.todoroo.andlib.sql; - -import static com.todoroo.andlib.sql.SqlConstants.ALL; -import static com.todoroo.andlib.sql.SqlConstants.COMMA; -import static com.todoroo.andlib.sql.SqlConstants.FROM; -import static com.todoroo.andlib.sql.SqlConstants.GROUP_BY; -import static com.todoroo.andlib.sql.SqlConstants.LEFT_PARENTHESIS; -import static com.todoroo.andlib.sql.SqlConstants.LIMIT; -import static com.todoroo.andlib.sql.SqlConstants.ORDER_BY; -import static com.todoroo.andlib.sql.SqlConstants.RIGHT_PARENTHESIS; -import static com.todoroo.andlib.sql.SqlConstants.SELECT; -import static com.todoroo.andlib.sql.SqlConstants.SPACE; -import static com.todoroo.andlib.sql.SqlConstants.WHERE; -import static com.todoroo.andlib.sql.SqlTable.table; -import static java.util.Arrays.asList; - -import java.util.ArrayList; - -import com.todoroo.andlib.data.Property; - -public final class Query { - - private SqlTable table; - private String queryTemplate = null; - private final ArrayList criterions = new ArrayList(); - private final ArrayList fields = new ArrayList(); - private final ArrayList joins = new ArrayList(); - private final ArrayList groupBies = new ArrayList(); - private final ArrayList orders = new ArrayList(); - private final ArrayList havings = new ArrayList(); - private int limits = -1; - - private Query(Field... fields) { - this.fields.addAll(asList(fields)); - } - - public static Query select(Field... fields) { - return new Query(fields); - } - - public Query from(SqlTable fromTable) { - this.table = fromTable; - return this; - } - - public Query join(Join... join) { - joins.addAll(asList(join)); - return this; - } - - public Query where(Criterion criterion) { - criterions.add(criterion); - return this; - } - - public Query groupBy(Field... groupBy) { - groupBies.addAll(asList(groupBy)); - return this; - } - - public Query orderBy(Order... order) { - orders.addAll(asList(order)); - return this; - } - - public Query limit(int limit) { - limits = limit; - return this; - } - - public Query appendSelectFields(Property... selectFields) { - this.fields.addAll(asList(selectFields)); - return this; - } - - @Override - public boolean equals(Object o) { - return this == o || !(o == null || getClass() != o.getClass()) && this.toString().equals(o.toString()); - } - - @Override - public int hashCode() { - return toString().hashCode(); - } - - @Override - public String toString() { - StringBuilder sql = new StringBuilder(); - visitSelectClause(sql); - visitFromClause(sql); - - visitJoinClause(sql); - if(queryTemplate == null) { - visitWhereClause(sql); - visitGroupByClause(sql); - visitOrderByClause(sql); - visitLimitClause(sql); - } else { - 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); - } - - 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); - } - } - - private void visitFromClause(StringBuilder sql) { - if (table == null) { - return; - } - sql.append(FROM).append(SPACE).append(table).append(SPACE); - } - - private void visitSelectClause(StringBuilder sql) { - sql.append(SELECT).append(SPACE); - if (fields.isEmpty()) { - sql.append(ALL).append(SPACE); - return; - } - for (Field field : fields) { - sql.append(field.toStringInSelect()).append(COMMA); - } - sql.deleteCharAt(sql.length() - 1).append(SPACE); - } - - private void visitLimitClause(StringBuilder sql) { - if(limits > -1) - sql.append(LIMIT).append(SPACE).append(limits).append(SPACE); - } - - public SqlTable as(String alias) { - return table(LEFT_PARENTHESIS + this.toString() + RIGHT_PARENTHESIS).as(alias); - } - - public Query having(Criterion criterion) { - this.havings.add(criterion); - return this; - } - - /** - * Gets a list of fields returned by this query - * @return - */ - public Property[] getFields() { - return fields.toArray(new Property[fields.size()]); - } - - /** - * Add the SQL query template (comes after the "from") - * @param sqlQuery - * @return - */ - public Query withQueryTemplate(String template) { - queryTemplate = template; - return this; - } -} +package com.todoroo.andlib.sql; + +import static com.todoroo.andlib.sql.SqlConstants.ALL; +import static com.todoroo.andlib.sql.SqlConstants.COMMA; +import static com.todoroo.andlib.sql.SqlConstants.FROM; +import static com.todoroo.andlib.sql.SqlConstants.GROUP_BY; +import static com.todoroo.andlib.sql.SqlConstants.LEFT_PARENTHESIS; +import static com.todoroo.andlib.sql.SqlConstants.LIMIT; +import static com.todoroo.andlib.sql.SqlConstants.ORDER_BY; +import static com.todoroo.andlib.sql.SqlConstants.RIGHT_PARENTHESIS; +import static com.todoroo.andlib.sql.SqlConstants.SELECT; +import static com.todoroo.andlib.sql.SqlConstants.SPACE; +import static com.todoroo.andlib.sql.SqlConstants.WHERE; +import static com.todoroo.andlib.sql.SqlTable.table; +import static java.util.Arrays.asList; + +import java.util.ArrayList; + +import com.todoroo.andlib.data.Property; + +public final class Query { + + private SqlTable table; + private String queryTemplate = null; + private final ArrayList criterions = new ArrayList(); + private final ArrayList fields = new ArrayList(); + private final ArrayList joins = new ArrayList(); + private final ArrayList groupBies = new ArrayList(); + private final ArrayList orders = new ArrayList(); + private final ArrayList havings = new ArrayList(); + private int limits = -1; + + private Query(Field... fields) { + this.fields.addAll(asList(fields)); + } + + public static Query select(Field... fields) { + return new Query(fields); + } + + public Query from(SqlTable fromTable) { + this.table = fromTable; + return this; + } + + public Query join(Join... join) { + joins.addAll(asList(join)); + return this; + } + + public Query where(Criterion criterion) { + criterions.add(criterion); + return this; + } + + public Query groupBy(Field... groupBy) { + groupBies.addAll(asList(groupBy)); + return this; + } + + public Query orderBy(Order... order) { + orders.addAll(asList(order)); + return this; + } + + public Query limit(int limit) { + limits = limit; + return this; + } + + public Query appendSelectFields(Property... selectFields) { + this.fields.addAll(asList(selectFields)); + return this; + } + + @Override + public boolean equals(Object o) { + return this == o || !(o == null || getClass() != o.getClass()) && this.toString().equals(o.toString()); + } + + @Override + public int hashCode() { + return toString().hashCode(); + } + + @Override + public String toString() { + StringBuilder sql = new StringBuilder(); + visitSelectClause(sql); + visitFromClause(sql); + + visitJoinClause(sql); + if(queryTemplate == null) { + visitWhereClause(sql); + visitGroupByClause(sql); + visitOrderByClause(sql); + visitLimitClause(sql); + } else { + 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); + } + + 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); + } + } + + private void visitFromClause(StringBuilder sql) { + if (table == null) { + return; + } + sql.append(FROM).append(SPACE).append(table).append(SPACE); + } + + private void visitSelectClause(StringBuilder sql) { + sql.append(SELECT).append(SPACE); + if (fields.isEmpty()) { + sql.append(ALL).append(SPACE); + return; + } + for (Field field : fields) { + sql.append(field.toStringInSelect()).append(COMMA); + } + sql.deleteCharAt(sql.length() - 1).append(SPACE); + } + + private void visitLimitClause(StringBuilder sql) { + if(limits > -1) + sql.append(LIMIT).append(SPACE).append(limits).append(SPACE); + } + + public SqlTable as(String alias) { + return table(LEFT_PARENTHESIS + this.toString() + RIGHT_PARENTHESIS).as(alias); + } + + public Query having(Criterion criterion) { + this.havings.add(criterion); + return this; + } + + /** + * Gets a list of fields returned by this query + * @return + */ + public Property[] getFields() { + return fields.toArray(new Property[fields.size()]); + } + + /** + * Add the SQL query template (comes after the "from") + * @param sqlQuery + * @return + */ + public Query withQueryTemplate(String template) { + queryTemplate = template; + return this; + } +} diff --git a/astrid/common-src/com/todoroo/andlib/sql/QueryTemplate.java b/astrid/common-src/com/todoroo/andlib/sql/QueryTemplate.java index 220905a01..abd506f18 100644 --- a/astrid/common-src/com/todoroo/andlib/sql/QueryTemplate.java +++ b/astrid/common-src/com/todoroo/andlib/sql/QueryTemplate.java @@ -1,117 +1,117 @@ -package com.todoroo.andlib.sql; - -import static com.todoroo.andlib.sql.SqlConstants.COMMA; -import static com.todoroo.andlib.sql.SqlConstants.GROUP_BY; -import static com.todoroo.andlib.sql.SqlConstants.LIMIT; -import static com.todoroo.andlib.sql.SqlConstants.ORDER_BY; -import static com.todoroo.andlib.sql.SqlConstants.SPACE; -import static com.todoroo.andlib.sql.SqlConstants.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 - * - */ -public final class QueryTemplate { - - private final ArrayList criterions = new ArrayList(); - private final ArrayList joins = new ArrayList(); - private final ArrayList groupBies = new ArrayList(); - private final ArrayList orders = new ArrayList(); - private final ArrayList havings = new ArrayList(); - private Integer limit = null; - - 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); - if(limit != null) - sql.append(LIMIT).append(SPACE).append(limit); - 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; - } - - public QueryTemplate limit(int limitValue) { - this.limit = limitValue; - return this; - } -} +package com.todoroo.andlib.sql; + +import static com.todoroo.andlib.sql.SqlConstants.COMMA; +import static com.todoroo.andlib.sql.SqlConstants.GROUP_BY; +import static com.todoroo.andlib.sql.SqlConstants.LIMIT; +import static com.todoroo.andlib.sql.SqlConstants.ORDER_BY; +import static com.todoroo.andlib.sql.SqlConstants.SPACE; +import static com.todoroo.andlib.sql.SqlConstants.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 + * + */ +public final class QueryTemplate { + + private final ArrayList criterions = new ArrayList(); + private final ArrayList joins = new ArrayList(); + private final ArrayList groupBies = new ArrayList(); + private final ArrayList orders = new ArrayList(); + private final ArrayList havings = new ArrayList(); + private Integer limit = null; + + 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); + if(limit != null) + sql.append(LIMIT).append(SPACE).append(limit); + 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; + } + + public QueryTemplate limit(int limitValue) { + this.limit = limitValue; + return this; + } +} diff --git a/astrid/common-src/com/todoroo/andlib/sql/SqlConstants.java b/astrid/common-src/com/todoroo/andlib/sql/SqlConstants.java index 63fee3fd0..bb61d9580 100644 --- a/astrid/common-src/com/todoroo/andlib/sql/SqlConstants.java +++ b/astrid/common-src/com/todoroo/andlib/sql/SqlConstants.java @@ -1,25 +1,25 @@ -package com.todoroo.andlib.sql; - -@SuppressWarnings("nls") -public final class SqlConstants { - static final String SELECT = "SELECT"; - static final String SPACE = " "; - static final String AS = "AS"; - static final String COMMA = ","; - static final String FROM = "FROM"; - static final String ON = "ON"; - static final String JOIN = "JOIN"; - static final String ALL = "*"; - static final String LEFT_PARENTHESIS = "("; - static final String RIGHT_PARENTHESIS = ")"; - static final String AND = "AND"; - static final String BETWEEN = "BETWEEN"; - static final String LIKE = "LIKE"; - static final String OR = "OR"; - static final String ORDER_BY = "ORDER BY"; - static final String GROUP_BY = "GROUP BY"; - static final String WHERE = "WHERE"; - public static final String EXISTS = "EXISTS"; - public static final String NOT = "NOT"; - public static final String LIMIT = "LIMIT"; -} +package com.todoroo.andlib.sql; + +@SuppressWarnings("nls") +public final class SqlConstants { + static final String SELECT = "SELECT"; + static final String SPACE = " "; + static final String AS = "AS"; + static final String COMMA = ","; + static final String FROM = "FROM"; + static final String ON = "ON"; + static final String JOIN = "JOIN"; + static final String ALL = "*"; + static final String LEFT_PARENTHESIS = "("; + static final String RIGHT_PARENTHESIS = ")"; + static final String AND = "AND"; + static final String BETWEEN = "BETWEEN"; + static final String LIKE = "LIKE"; + static final String OR = "OR"; + static final String ORDER_BY = "ORDER BY"; + static final String GROUP_BY = "GROUP BY"; + static final String WHERE = "WHERE"; + public static final String EXISTS = "EXISTS"; + public static final String NOT = "NOT"; + public static final String LIMIT = "LIMIT"; +} diff --git a/astrid/common-src/com/todoroo/andlib/sql/SqlTable.java b/astrid/common-src/com/todoroo/andlib/sql/SqlTable.java index 07bc2e998..4205ce617 100644 --- a/astrid/common-src/com/todoroo/andlib/sql/SqlTable.java +++ b/astrid/common-src/com/todoroo/andlib/sql/SqlTable.java @@ -1,20 +1,20 @@ -package com.todoroo.andlib.sql; - -public class SqlTable extends DBObject { - - protected SqlTable(String expression) { - super(expression); - } - - public static SqlTable table(String table) { - return new SqlTable(table); - } - - @SuppressWarnings("nls") - protected String fieldExpression(String fieldName) { - if (hasAlias()) { - return alias + "." + fieldName; - } - return expression+"."+fieldName; - } -} +package com.todoroo.andlib.sql; + +public class SqlTable extends DBObject { + + protected SqlTable(String expression) { + super(expression); + } + + public static SqlTable table(String table) { + return new SqlTable(table); + } + + @SuppressWarnings("nls") + protected String fieldExpression(String fieldName) { + if (hasAlias()) { + return alias + "." + fieldName; + } + return expression+"."+fieldName; + } +} diff --git a/astrid/common-src/com/todoroo/andlib/sql/UnaryCriterion.java b/astrid/common-src/com/todoroo/andlib/sql/UnaryCriterion.java index 340b0573c..98467b9a0 100644 --- a/astrid/common-src/com/todoroo/andlib/sql/UnaryCriterion.java +++ b/astrid/common-src/com/todoroo/andlib/sql/UnaryCriterion.java @@ -1,107 +1,107 @@ -package com.todoroo.andlib.sql; - -import static com.todoroo.andlib.sql.SqlConstants.SPACE; - -public class UnaryCriterion extends Criterion { - protected final Field expression; - protected final Object value; - - UnaryCriterion(Field expression, Operator operator, Object value) { - super(operator); - this.expression = expression; - this.value = value; - } - - @Override - protected void populate(StringBuilder sb) { - beforePopulateOperator(sb); - populateOperator(sb); - afterPopulateOperator(sb); - } - - public static Criterion eq(Field expression, Object value) { - return new UnaryCriterion(expression, Operator.eq, value); - } - - protected void beforePopulateOperator(StringBuilder sb) { - sb.append(expression); - } - - protected void populateOperator(StringBuilder sb) { - sb.append(operator); - } - - @SuppressWarnings("nls") - protected void afterPopulateOperator(StringBuilder sb) { - if(value == null) - return; - else if(value instanceof String) - sb.append("'").append(sanitize((String) value)).append("'"); - else - sb.append(value); - } - - /** - * Sanitize the given input for SQL - * @param input - * @return - */ - @SuppressWarnings("nls") - public static String sanitize(String input) { - return input.replace("'", "''"); - } - - public static Criterion neq(Field field, Object value) { - return new UnaryCriterion(field, Operator.neq, value); - } - - public static Criterion gt(Field field, Object value) { - return new UnaryCriterion(field, Operator.gt, value); - } - - public static Criterion lt(Field field, Object value) { - return new UnaryCriterion(field, Operator.lt, value); - } - - public static Criterion isNull(Field field) { - return new UnaryCriterion(field, Operator.isNull, null) { - @Override - protected void populateOperator(StringBuilder sb) { - sb.append(SPACE).append(operator); - } - }; - } - - public static Criterion isNotNull(Field field) { - return new UnaryCriterion(field, Operator.isNotNull, null) { - @Override - protected void populateOperator(StringBuilder sb) { - sb.append(SPACE).append(operator); - } - }; - } - - public static Criterion like(Field field, String value) { - return new UnaryCriterion(field, Operator.like, value) { - @Override - protected void populateOperator(StringBuilder sb) { - sb.append(SPACE).append(operator).append(SPACE); - } - }; - } - - public static Criterion like(Field field, String value, final String escape) { - return new UnaryCriterion(field, Operator.like, value) { - @Override - protected void populateOperator(StringBuilder sb) { - sb.append(SPACE).append(operator).append(SPACE); - } - @SuppressWarnings("nls") - @Override - protected void afterPopulateOperator(StringBuilder sb) { - super.afterPopulateOperator(sb); - sb.append(SPACE).append("ESCAPE").append(" '").append(sanitize(escape)).append("'"); - } - }; - } -} +package com.todoroo.andlib.sql; + +import static com.todoroo.andlib.sql.SqlConstants.SPACE; + +public class UnaryCriterion extends Criterion { + protected final Field expression; + protected final Object value; + + UnaryCriterion(Field expression, Operator operator, Object value) { + super(operator); + this.expression = expression; + this.value = value; + } + + @Override + protected void populate(StringBuilder sb) { + beforePopulateOperator(sb); + populateOperator(sb); + afterPopulateOperator(sb); + } + + public static Criterion eq(Field expression, Object value) { + return new UnaryCriterion(expression, Operator.eq, value); + } + + protected void beforePopulateOperator(StringBuilder sb) { + sb.append(expression); + } + + protected void populateOperator(StringBuilder sb) { + sb.append(operator); + } + + @SuppressWarnings("nls") + protected void afterPopulateOperator(StringBuilder sb) { + if(value == null) + return; + else if(value instanceof String) + sb.append("'").append(sanitize((String) value)).append("'"); + else + sb.append(value); + } + + /** + * Sanitize the given input for SQL + * @param input + * @return + */ + @SuppressWarnings("nls") + public static String sanitize(String input) { + return input.replace("'", "''"); + } + + public static Criterion neq(Field field, Object value) { + return new UnaryCriterion(field, Operator.neq, value); + } + + public static Criterion gt(Field field, Object value) { + return new UnaryCriterion(field, Operator.gt, value); + } + + public static Criterion lt(Field field, Object value) { + return new UnaryCriterion(field, Operator.lt, value); + } + + public static Criterion isNull(Field field) { + return new UnaryCriterion(field, Operator.isNull, null) { + @Override + protected void populateOperator(StringBuilder sb) { + sb.append(SPACE).append(operator); + } + }; + } + + public static Criterion isNotNull(Field field) { + return new UnaryCriterion(field, Operator.isNotNull, null) { + @Override + protected void populateOperator(StringBuilder sb) { + sb.append(SPACE).append(operator); + } + }; + } + + public static Criterion like(Field field, String value) { + return new UnaryCriterion(field, Operator.like, value) { + @Override + protected void populateOperator(StringBuilder sb) { + sb.append(SPACE).append(operator).append(SPACE); + } + }; + } + + public static Criterion like(Field field, String value, final String escape) { + return new UnaryCriterion(field, Operator.like, value) { + @Override + protected void populateOperator(StringBuilder sb) { + sb.append(SPACE).append(operator).append(SPACE); + } + @SuppressWarnings("nls") + @Override + protected void afterPopulateOperator(StringBuilder sb) { + super.afterPopulateOperator(sb); + sb.append(SPACE).append("ESCAPE").append(" '").append(sanitize(escape)).append("'"); + } + }; + } +} diff --git a/astrid/plugin-src/com/todoroo/astrid/gcal/Calendars.java b/astrid/plugin-src/com/todoroo/astrid/gcal/Calendars.java index 00a61ba19..8f4befc42 100644 --- a/astrid/plugin-src/com/todoroo/astrid/gcal/Calendars.java +++ b/astrid/plugin-src/com/todoroo/astrid/gcal/Calendars.java @@ -1,146 +1,146 @@ -package com.todoroo.astrid.gcal; - -import android.content.ContentResolver; -import android.content.Context; -import android.content.res.Resources; -import android.database.Cursor; -import android.net.Uri; - -import com.timsu.astrid.R; -import com.todoroo.andlib.service.ContextManager; -import com.todoroo.andlib.utility.AndroidUtilities; -import com.todoroo.astrid.utility.Preferences; - -@SuppressWarnings("nls") -public class Calendars { - - public static final String CALENDAR_CONTENT_CALENDARS = "calendars"; - public static final String CALENDAR_CONTENT_EVENTS = "events"; - - private static final String ID_COLUMN_NAME = "_id"; - private static final String DISPLAY_COLUMN_NAME = "displayName"; - private static final String ACCES_LEVEL_COLUMN_NAME = "access_level"; - - private static final String[] CALENDARS_PROJECTION = new String[] { - ID_COLUMN_NAME, // Calendars._ID, - DISPLAY_COLUMN_NAME // Calendars.DISPLAY_NAME - }; - - // Only show calendars that the user can modify. Access level 500 - // corresponds to Calendars.CONTRIBUTOR_ACCESS - private static final String CALENDARS_WHERE = ACCES_LEVEL_COLUMN_NAME + ">= 500"; - - private static final String CALENDARS_SORT = "displayName ASC"; - - // --- api access - - /** Return content uri for calendars - * @param table provider table, something like calendars, events - */ - public static Uri getCalendarContentUri(String table) { - if(AndroidUtilities.getSdkVersion() >= 8) - return Uri.parse("content://com.android.calendar/" + table); - else - return Uri.parse("content://calendar/" + table); - } - - /** Return calendar package name */ - public static String getCalendarPackage() { - if(AndroidUtilities.getSdkVersion() >= 8) - return "com.google.android.calendar"; - else - return "com.android.calendar"; - } - - // --- helper data structure - - /** - * Helper class for working with the results of getCalendars - */ - public static class CalendarResult { - /** calendar names */ - public String[] calendars; - - /** calendar ids. null entry -> use default */ - public String[] calendarIds; - - /** default selection index */ - public int defaultIndex = -1; - } - - /** - * Appends all user-modifiable calendars to listPreference. Always includes - * entry called "Astrid default" with calendar id of - * prefs_defaultCalendar_default. - * - * @param context - * context - * @param listPreference - * preference to init - */ - public static CalendarResult getCalendars() { - Context context = ContextManager.getContext(); - ContentResolver cr = context.getContentResolver(); - Resources r = context.getResources(); - Cursor c = cr.query(getCalendarContentUri(CALENDAR_CONTENT_CALENDARS), CALENDARS_PROJECTION, - CALENDARS_WHERE, null, CALENDARS_SORT); - try { - // Fetch the current setting. Invalid calendar id will - // be changed to default value. - String defaultSetting = Preferences.getStringValue(R.string.gcal_p_default); - - CalendarResult result = new CalendarResult(); - - if (c == null || c.getCount() == 0) { - // Something went wrong when querying calendars. Only offer them - // the system default choice - result.calendars = new String[] { - r.getString(R.string.gcal_GCP_default) }; - result.calendarIds = new String[] { null }; - result.defaultIndex = 0; - return result; - } - - int calendarCount = c.getCount(); - - result.calendars = new String[calendarCount]; - result.calendarIds = new String[calendarCount]; - - // Iterate calendars one by one, and fill up the list preference - int row = 0; - int idColumn = c.getColumnIndex(ID_COLUMN_NAME); - int nameColumn = c.getColumnIndex(DISPLAY_COLUMN_NAME); - while (c.moveToNext()) { - String id = c.getString(idColumn); - String name = c.getString(nameColumn); - result.calendars[row] = name; - result.calendarIds[row] = id; - - // We found currently selected calendar - if (defaultSetting != null && defaultSetting.equals(id)) { - result.defaultIndex = row; - } - - row++; - } - - if (result.defaultIndex == -1 || result.defaultIndex >= calendarCount) { - result.defaultIndex = 0; - } - - return result; - } finally { - if(c != null) - c.close(); - } - } - - /** - * sets the default calendar for future use - * @param defaultCalendar default calendar id - */ - public static void setDefaultCalendar(String defaultCalendar) { - Preferences.setString(R.string.gcal_p_default, defaultCalendar); - } - +package com.todoroo.astrid.gcal; + +import android.content.ContentResolver; +import android.content.Context; +import android.content.res.Resources; +import android.database.Cursor; +import android.net.Uri; + +import com.timsu.astrid.R; +import com.todoroo.andlib.service.ContextManager; +import com.todoroo.andlib.utility.AndroidUtilities; +import com.todoroo.astrid.utility.Preferences; + +@SuppressWarnings("nls") +public class Calendars { + + public static final String CALENDAR_CONTENT_CALENDARS = "calendars"; + public static final String CALENDAR_CONTENT_EVENTS = "events"; + + private static final String ID_COLUMN_NAME = "_id"; + private static final String DISPLAY_COLUMN_NAME = "displayName"; + private static final String ACCES_LEVEL_COLUMN_NAME = "access_level"; + + private static final String[] CALENDARS_PROJECTION = new String[] { + ID_COLUMN_NAME, // Calendars._ID, + DISPLAY_COLUMN_NAME // Calendars.DISPLAY_NAME + }; + + // Only show calendars that the user can modify. Access level 500 + // corresponds to Calendars.CONTRIBUTOR_ACCESS + private static final String CALENDARS_WHERE = ACCES_LEVEL_COLUMN_NAME + ">= 500"; + + private static final String CALENDARS_SORT = "displayName ASC"; + + // --- api access + + /** Return content uri for calendars + * @param table provider table, something like calendars, events + */ + public static Uri getCalendarContentUri(String table) { + if(AndroidUtilities.getSdkVersion() >= 8) + return Uri.parse("content://com.android.calendar/" + table); + else + return Uri.parse("content://calendar/" + table); + } + + /** Return calendar package name */ + public static String getCalendarPackage() { + if(AndroidUtilities.getSdkVersion() >= 8) + return "com.google.android.calendar"; + else + return "com.android.calendar"; + } + + // --- helper data structure + + /** + * Helper class for working with the results of getCalendars + */ + public static class CalendarResult { + /** calendar names */ + public String[] calendars; + + /** calendar ids. null entry -> use default */ + public String[] calendarIds; + + /** default selection index */ + public int defaultIndex = -1; + } + + /** + * Appends all user-modifiable calendars to listPreference. Always includes + * entry called "Astrid default" with calendar id of + * prefs_defaultCalendar_default. + * + * @param context + * context + * @param listPreference + * preference to init + */ + public static CalendarResult getCalendars() { + Context context = ContextManager.getContext(); + ContentResolver cr = context.getContentResolver(); + Resources r = context.getResources(); + Cursor c = cr.query(getCalendarContentUri(CALENDAR_CONTENT_CALENDARS), CALENDARS_PROJECTION, + CALENDARS_WHERE, null, CALENDARS_SORT); + try { + // Fetch the current setting. Invalid calendar id will + // be changed to default value. + String defaultSetting = Preferences.getStringValue(R.string.gcal_p_default); + + CalendarResult result = new CalendarResult(); + + if (c == null || c.getCount() == 0) { + // Something went wrong when querying calendars. Only offer them + // the system default choice + result.calendars = new String[] { + r.getString(R.string.gcal_GCP_default) }; + result.calendarIds = new String[] { null }; + result.defaultIndex = 0; + return result; + } + + int calendarCount = c.getCount(); + + result.calendars = new String[calendarCount]; + result.calendarIds = new String[calendarCount]; + + // Iterate calendars one by one, and fill up the list preference + int row = 0; + int idColumn = c.getColumnIndex(ID_COLUMN_NAME); + int nameColumn = c.getColumnIndex(DISPLAY_COLUMN_NAME); + while (c.moveToNext()) { + String id = c.getString(idColumn); + String name = c.getString(nameColumn); + result.calendars[row] = name; + result.calendarIds[row] = id; + + // We found currently selected calendar + if (defaultSetting != null && defaultSetting.equals(id)) { + result.defaultIndex = row; + } + + row++; + } + + if (result.defaultIndex == -1 || result.defaultIndex >= calendarCount) { + result.defaultIndex = 0; + } + + return result; + } finally { + if(c != null) + c.close(); + } + } + + /** + * sets the default calendar for future use + * @param defaultCalendar default calendar id + */ + public static void setDefaultCalendar(String defaultCalendar) { + Preferences.setString(R.string.gcal_p_default, defaultCalendar); + } + } \ No newline at end of file diff --git a/astrid/plugin-src/com/todoroo/astrid/notes/NoteDetailExposer.java b/astrid/plugin-src/com/todoroo/astrid/notes/NoteDetailExposer.java index d08adf488..ba9a879c0 100644 --- a/astrid/plugin-src/com/todoroo/astrid/notes/NoteDetailExposer.java +++ b/astrid/plugin-src/com/todoroo/astrid/notes/NoteDetailExposer.java @@ -62,7 +62,7 @@ public class NoteDetailExposer extends BroadcastReceiver implements DetailExpose if(notes.length() == 0) return null; - return notes; + return " " + notes; //$NON-NLS-1$ } @Override diff --git a/astrid/plugin-src/com/todoroo/astrid/producteev/ProducteevDetailExposer.java b/astrid/plugin-src/com/todoroo/astrid/producteev/ProducteevDetailExposer.java index 70f6cd063..e9586fc8e 100644 --- a/astrid/plugin-src/com/todoroo/astrid/producteev/ProducteevDetailExposer.java +++ b/astrid/plugin-src/com/todoroo/astrid/producteev/ProducteevDetailExposer.java @@ -7,7 +7,6 @@ import android.content.BroadcastReceiver; import android.content.Context; import android.content.Intent; -import com.timsu.astrid.R; import com.todoroo.andlib.data.TodorooCursor; import com.todoroo.astrid.adapter.TaskAdapter; import com.todoroo.astrid.api.AstridApiConstants; @@ -76,8 +75,7 @@ public class ProducteevDetailExposer extends BroadcastReceiver implements Detail != Preferences.getLong(ProducteevUtilities.PREF_DEFAULT_DASHBOARD, 0L) && ownerDashboard != null) { String dashboardName = ownerDashboard.getValue(ProducteevDashboard.NAME); - builder.append(context.getString(R.string.producteev_TLA_dashboard, - dashboardName)).append(TaskAdapter.DETAIL_SEPARATOR); + builder.append(" ").append(dashboardName).append(TaskAdapter.DETAIL_SEPARATOR); //$NON-NLS-1$ } // display responsible user if not current one @@ -88,8 +86,7 @@ public class ProducteevDetailExposer extends BroadcastReceiver implements Detail if(index > -1) { String user = users.substring(users.indexOf(',', index) + 1, users.indexOf(';', index + 1)); - builder.append(context.getString(R.string.producteev_TLA_responsible, - user)).append(TaskAdapter.DETAIL_SEPARATOR); + builder.append(" ").append(user).append(TaskAdapter.DETAIL_SEPARATOR); //$NON-NLS-1$ } } } else { diff --git a/astrid/plugin-src/com/todoroo/astrid/reminders/NotificationActivity.java b/astrid/plugin-src/com/todoroo/astrid/reminders/NotificationActivity.java index 6d38021dd..97255c878 100644 --- a/astrid/plugin-src/com/todoroo/astrid/reminders/NotificationActivity.java +++ b/astrid/plugin-src/com/todoroo/astrid/reminders/NotificationActivity.java @@ -1,149 +1,149 @@ -/* - * ASTRID: Android's Simple Task Recording Dashboard - * - * Copyright (c) 2009 Tim Su - * - * This program is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation; either version 2 of the License, or - * (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, but - * WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY - * or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License - * for more details. - * - * You should have received a copy of the GNU General Public License along - * with this program; if not, write to the Free Software Foundation, Inc., - * 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA - */ -package com.todoroo.astrid.reminders; - -import java.util.Date; - -import android.app.TimePickerDialog; -import android.app.TimePickerDialog.OnTimeSetListener; -import android.content.Intent; -import android.os.Bundle; -import android.view.View; -import android.view.View.OnClickListener; -import android.view.ViewGroup; -import android.widget.Button; -import android.widget.TextView; -import android.widget.TimePicker; - -import com.timsu.astrid.R; -import com.todoroo.andlib.sql.QueryTemplate; -import com.todoroo.andlib.utility.DateUtilities; -import com.todoroo.astrid.activity.TaskListActivity; -import com.todoroo.astrid.api.Filter; -import com.todoroo.astrid.dao.TaskDao.TaskCriteria; -import com.todoroo.astrid.utility.Preferences; - -/** - * This activity is launched when a user opens up a notification from the - * tray. It launches the appropriate activity based on the passed in parameters. - * - * @author timsu - * - */ -public class NotificationActivity extends TaskListActivity implements OnTimeSetListener { - - // --- constants - - /** task id from notification */ - public static final String TOKEN_ID = "id"; //$NON-NLS-1$ - - // --- implementation - - private long taskId; - - @Override - public void onCreate(Bundle savedInstanceState) { - populateFilter(getIntent()); - super.onCreate(savedInstanceState); - - displayNotificationPopup(); - } - - @Override - protected void onNewIntent(Intent intent) { - populateFilter(intent); - super.onNewIntent(intent); - } - - private void populateFilter(Intent intent) { - taskId = intent.getLongExtra(TOKEN_ID, -1); - if(taskId == -1) - return; - - Filter itemFilter = new Filter(getString(R.string.rmd_NoA_filter), - getString(R.string.rmd_NoA_filter), - new QueryTemplate().where(TaskCriteria.byId(taskId)), - null); - intent.putExtra(TaskListActivity.TOKEN_FILTER, itemFilter); - } - - /** - * Set up the UI for this activity - */ - private void displayNotificationPopup() { - // hide quick add - findViewById(R.id.taskListFooter).setVisibility(View.GONE); - - // instantiate reminder window - ViewGroup parent = (ViewGroup) findViewById(R.id.taskListParent); - getLayoutInflater().inflate(R.layout.notification_control, parent, true); - - String reminder = Notifications.getRandomReminder(getResources().getStringArray(R.array.reminder_responses)); - - if(Preferences.getBoolean(R.string.p_rmd_nagging, true)) - ((TextView)findViewById(R.id.reminderLabel)).setText(reminder); - else { - findViewById(R.id.reminderLabel).setVisibility(View.GONE); - findViewById(R.id.astridIcon).setVisibility(View.GONE); - } - - // set up listeners - ((Button)findViewById(R.id.goAway)).setOnClickListener(new OnClickListener() { - @Override - public void onClick(View arg0) { - finish(); - } - }); - - ((Button)findViewById(R.id.snooze)).setOnClickListener(new OnClickListener() { - @Override - public void onClick(View arg0) { - snooze(); - } - }); - } - - /** - * Snooze and re-trigger this alarm - */ - private void snooze() { - Date now = new Date(); - now.setHours(now.getHours() + 1); - int hour = now.getHours(); - int minute = now.getMinutes(); - TimePickerDialog timePicker = new TimePickerDialog(this, this, - hour, minute, DateUtilities.is24HourFormat(this)); - timePicker.show(); - } - - /** snooze timer set */ - @Override - public void onTimeSet(TimePicker picker, int hours, int minutes) { - Date alarmTime = new Date(); - alarmTime.setHours(hours); - alarmTime.setMinutes(minutes); - if(alarmTime.getTime() < DateUtilities.now()) - alarmTime.setDate(alarmTime.getDate() + 1); - ReminderService.getInstance().scheduleSnoozeAlarm(taskId, alarmTime.getTime()); - finish(); - } - - -} +/* + * ASTRID: Android's Simple Task Recording Dashboard + * + * Copyright (c) 2009 Tim Su + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, but + * WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY + * or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License + * for more details. + * + * You should have received a copy of the GNU General Public License along + * with this program; if not, write to the Free Software Foundation, Inc., + * 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + */ +package com.todoroo.astrid.reminders; + +import java.util.Date; + +import android.app.TimePickerDialog; +import android.app.TimePickerDialog.OnTimeSetListener; +import android.content.Intent; +import android.os.Bundle; +import android.view.View; +import android.view.View.OnClickListener; +import android.view.ViewGroup; +import android.widget.Button; +import android.widget.TextView; +import android.widget.TimePicker; + +import com.timsu.astrid.R; +import com.todoroo.andlib.sql.QueryTemplate; +import com.todoroo.andlib.utility.DateUtilities; +import com.todoroo.astrid.activity.TaskListActivity; +import com.todoroo.astrid.api.Filter; +import com.todoroo.astrid.dao.TaskDao.TaskCriteria; +import com.todoroo.astrid.utility.Preferences; + +/** + * This activity is launched when a user opens up a notification from the + * tray. It launches the appropriate activity based on the passed in parameters. + * + * @author timsu + * + */ +public class NotificationActivity extends TaskListActivity implements OnTimeSetListener { + + // --- constants + + /** task id from notification */ + public static final String TOKEN_ID = "id"; //$NON-NLS-1$ + + // --- implementation + + private long taskId; + + @Override + public void onCreate(Bundle savedInstanceState) { + populateFilter(getIntent()); + super.onCreate(savedInstanceState); + + displayNotificationPopup(); + } + + @Override + protected void onNewIntent(Intent intent) { + populateFilter(intent); + super.onNewIntent(intent); + } + + private void populateFilter(Intent intent) { + taskId = intent.getLongExtra(TOKEN_ID, -1); + if(taskId == -1) + return; + + Filter itemFilter = new Filter(getString(R.string.rmd_NoA_filter), + getString(R.string.rmd_NoA_filter), + new QueryTemplate().where(TaskCriteria.byId(taskId)), + null); + intent.putExtra(TaskListActivity.TOKEN_FILTER, itemFilter); + } + + /** + * Set up the UI for this activity + */ + private void displayNotificationPopup() { + // hide quick add + findViewById(R.id.taskListFooter).setVisibility(View.GONE); + + // instantiate reminder window + ViewGroup parent = (ViewGroup) findViewById(R.id.taskListParent); + getLayoutInflater().inflate(R.layout.notification_control, parent, true); + + String reminder = Notifications.getRandomReminder(getResources().getStringArray(R.array.reminder_responses)); + + if(Preferences.getBoolean(R.string.p_rmd_nagging, true)) + ((TextView)findViewById(R.id.reminderLabel)).setText(reminder); + else { + findViewById(R.id.reminderLabel).setVisibility(View.GONE); + findViewById(R.id.astridIcon).setVisibility(View.GONE); + } + + // set up listeners + ((Button)findViewById(R.id.goAway)).setOnClickListener(new OnClickListener() { + @Override + public void onClick(View arg0) { + finish(); + } + }); + + ((Button)findViewById(R.id.snooze)).setOnClickListener(new OnClickListener() { + @Override + public void onClick(View arg0) { + snooze(); + } + }); + } + + /** + * Snooze and re-trigger this alarm + */ + private void snooze() { + Date now = new Date(); + now.setHours(now.getHours() + 1); + int hour = now.getHours(); + int minute = now.getMinutes(); + TimePickerDialog timePicker = new TimePickerDialog(this, this, + hour, minute, DateUtilities.is24HourFormat(this)); + timePicker.show(); + } + + /** snooze timer set */ + @Override + public void onTimeSet(TimePicker picker, int hours, int minutes) { + Date alarmTime = new Date(); + alarmTime.setHours(hours); + alarmTime.setMinutes(minutes); + if(alarmTime.getTime() < DateUtilities.now()) + alarmTime.setDate(alarmTime.getDate() + 1); + ReminderService.getInstance().scheduleSnoozeAlarm(taskId, alarmTime.getTime()); + finish(); + } + + +} diff --git a/astrid/plugin-src/com/todoroo/astrid/repeats/RepeatDetailExposer.java b/astrid/plugin-src/com/todoroo/astrid/repeats/RepeatDetailExposer.java index 4d332b583..e3cc35d97 100644 --- a/astrid/plugin-src/com/todoroo/astrid/repeats/RepeatDetailExposer.java +++ b/astrid/plugin-src/com/todoroo/astrid/repeats/RepeatDetailExposer.java @@ -114,7 +114,7 @@ public class RepeatDetailExposer extends BroadcastReceiver implements DetailExpo else detail = context.getString(R.string.repeat_detail_duedate, interval); - return detail; + return " " + detail; //$NON-NLS-1$ } return null; } diff --git a/astrid/plugin-src/com/todoroo/astrid/rmilk/MilkBackgroundService.java b/astrid/plugin-src/com/todoroo/astrid/rmilk/MilkBackgroundService.java index a3e14bc6a..50144084a 100644 --- a/astrid/plugin-src/com/todoroo/astrid/rmilk/MilkBackgroundService.java +++ b/astrid/plugin-src/com/todoroo/astrid/rmilk/MilkBackgroundService.java @@ -1,128 +1,128 @@ -package com.todoroo.astrid.rmilk; - -import android.app.AlarmManager; -import android.app.PendingIntent; -import android.app.Service; -import android.content.Context; -import android.content.Intent; -import android.os.IBinder; -import android.util.Log; - -import com.timsu.astrid.R; -import com.todoroo.andlib.service.ContextManager; -import com.todoroo.andlib.utility.DateUtilities; -import com.todoroo.astrid.rmilk.sync.RTMSyncProvider; -import com.todoroo.astrid.utility.Preferences; - -/** - * SynchronizationService is the service that performs Astrid's background - * synchronization with online task managers. Starting this service - * schedules a repeating alarm which handles the synchronization - * - * @author Tim Su - * - */ -public class MilkBackgroundService extends Service { - - /** Minimum time before an auto-sync */ - private static final long AUTO_SYNC_MIN_OFFSET = 5*60*1000L; - - /** alarm identifier */ - private static final String SYNC_ACTION = "sync"; //$NON-NLS-1$ - - // --- BroadcastReceiver abstract methods - - /** Receive the alarm - start the synchronize service! */ - @Override - public void onStart(Intent intent, int startId) { - if(SYNC_ACTION.equals(intent.getAction())) - startSynchronization(this); - } - - /** Start the actual synchronization */ - private void startSynchronization(Context context) { - if(context == null || context.getResources() == null) - return; - - ContextManager.setContext(context); - - if(MilkUtilities.isOngoing()) - return; - - new RTMSyncProvider().synchronize(context); - } - - // --- alarm management - - /** - * Schedules repeating alarm for auto-synchronization - */ - public static void scheduleService() { - int syncFrequencySeconds = Preferences.getIntegerFromString( - R.string.rmilk_MPr_interval_key, -1); - Context context = ContextManager.getContext(); - if(syncFrequencySeconds <= 0) { - unscheduleService(context); - return; - } - - // figure out synchronization frequency - long interval = 1000L * syncFrequencySeconds; - long offset = computeNextSyncOffset(interval); - - // give a little padding - offset = Math.max(offset, AUTO_SYNC_MIN_OFFSET); - - AlarmManager am = (AlarmManager) context.getSystemService(Context.ALARM_SERVICE); - PendingIntent pendingIntent = PendingIntent.getService(context, 0, - createAlarmIntent(context), PendingIntent.FLAG_UPDATE_CURRENT); - - Log.i("Astrid", "Autosync set for " + offset / 1000 //$NON-NLS-1$ //$NON-NLS-2$ - + " seconds repeating every " + syncFrequencySeconds); //$NON-NLS-1$ - - // cancel all existing - am.cancel(pendingIntent); - - // schedule new - am.setRepeating(AlarmManager.RTC_WAKEUP, System.currentTimeMillis() + offset, - interval, pendingIntent); - } - - - /** - * Removes repeating alarm for auto-synchronization - */ - private static void unscheduleService(Context context) { - AlarmManager am = (AlarmManager)context.getSystemService(Context.ALARM_SERVICE); - PendingIntent pendingIntent = PendingIntent.getService(context, 0, - createAlarmIntent(context), PendingIntent.FLAG_UPDATE_CURRENT); - am.cancel(pendingIntent); - } - - /** Create the alarm intent */ - private static Intent createAlarmIntent(Context context) { - Intent intent = new Intent(context, MilkBackgroundService.class); - intent.setAction(SYNC_ACTION); - return intent; - } - - // --- utility methods - - - private static long computeNextSyncOffset(long interval) { - // figure out last synchronize time - long lastSyncDate = MilkUtilities.getLastSyncDate(); - - // if user never synchronized, give them a full offset period before bg sync - if(lastSyncDate != 0) - return Math.max(0, lastSyncDate + interval - DateUtilities.now()); - else - return interval; - } - - @Override - public IBinder onBind(Intent intent) { - return null; - } - -} +package com.todoroo.astrid.rmilk; + +import android.app.AlarmManager; +import android.app.PendingIntent; +import android.app.Service; +import android.content.Context; +import android.content.Intent; +import android.os.IBinder; +import android.util.Log; + +import com.timsu.astrid.R; +import com.todoroo.andlib.service.ContextManager; +import com.todoroo.andlib.utility.DateUtilities; +import com.todoroo.astrid.rmilk.sync.RTMSyncProvider; +import com.todoroo.astrid.utility.Preferences; + +/** + * SynchronizationService is the service that performs Astrid's background + * synchronization with online task managers. Starting this service + * schedules a repeating alarm which handles the synchronization + * + * @author Tim Su + * + */ +public class MilkBackgroundService extends Service { + + /** Minimum time before an auto-sync */ + private static final long AUTO_SYNC_MIN_OFFSET = 5*60*1000L; + + /** alarm identifier */ + private static final String SYNC_ACTION = "sync"; //$NON-NLS-1$ + + // --- BroadcastReceiver abstract methods + + /** Receive the alarm - start the synchronize service! */ + @Override + public void onStart(Intent intent, int startId) { + if(SYNC_ACTION.equals(intent.getAction())) + startSynchronization(this); + } + + /** Start the actual synchronization */ + private void startSynchronization(Context context) { + if(context == null || context.getResources() == null) + return; + + ContextManager.setContext(context); + + if(MilkUtilities.isOngoing()) + return; + + new RTMSyncProvider().synchronize(context); + } + + // --- alarm management + + /** + * Schedules repeating alarm for auto-synchronization + */ + public static void scheduleService() { + int syncFrequencySeconds = Preferences.getIntegerFromString( + R.string.rmilk_MPr_interval_key, -1); + Context context = ContextManager.getContext(); + if(syncFrequencySeconds <= 0) { + unscheduleService(context); + return; + } + + // figure out synchronization frequency + long interval = 1000L * syncFrequencySeconds; + long offset = computeNextSyncOffset(interval); + + // give a little padding + offset = Math.max(offset, AUTO_SYNC_MIN_OFFSET); + + AlarmManager am = (AlarmManager) context.getSystemService(Context.ALARM_SERVICE); + PendingIntent pendingIntent = PendingIntent.getService(context, 0, + createAlarmIntent(context), PendingIntent.FLAG_UPDATE_CURRENT); + + Log.i("Astrid", "Autosync set for " + offset / 1000 //$NON-NLS-1$ //$NON-NLS-2$ + + " seconds repeating every " + syncFrequencySeconds); //$NON-NLS-1$ + + // cancel all existing + am.cancel(pendingIntent); + + // schedule new + am.setRepeating(AlarmManager.RTC_WAKEUP, System.currentTimeMillis() + offset, + interval, pendingIntent); + } + + + /** + * Removes repeating alarm for auto-synchronization + */ + private static void unscheduleService(Context context) { + AlarmManager am = (AlarmManager)context.getSystemService(Context.ALARM_SERVICE); + PendingIntent pendingIntent = PendingIntent.getService(context, 0, + createAlarmIntent(context), PendingIntent.FLAG_UPDATE_CURRENT); + am.cancel(pendingIntent); + } + + /** Create the alarm intent */ + private static Intent createAlarmIntent(Context context) { + Intent intent = new Intent(context, MilkBackgroundService.class); + intent.setAction(SYNC_ACTION); + return intent; + } + + // --- utility methods + + + private static long computeNextSyncOffset(long interval) { + // figure out last synchronize time + long lastSyncDate = MilkUtilities.getLastSyncDate(); + + // if user never synchronized, give them a full offset period before bg sync + if(lastSyncDate != 0) + return Math.max(0, lastSyncDate + interval - DateUtilities.now()); + else + return interval; + } + + @Override + public IBinder onBind(Intent intent) { + return null; + } + +} diff --git a/astrid/plugin-src/com/todoroo/astrid/rmilk/MilkDetailExposer.java b/astrid/plugin-src/com/todoroo/astrid/rmilk/MilkDetailExposer.java index 08f827acf..d32bd8f08 100644 --- a/astrid/plugin-src/com/todoroo/astrid/rmilk/MilkDetailExposer.java +++ b/astrid/plugin-src/com/todoroo/astrid/rmilk/MilkDetailExposer.java @@ -66,9 +66,8 @@ public class MilkDetailExposer extends BroadcastReceiver implements DetailExpose if(listName == null) return null; - if(listId > 0) { - builder.append(context.getString(R.string.rmilk_TLA_list, - listName)).append(TaskAdapter.DETAIL_SEPARATOR); + if(listId > 0 && !"Inbox".equals(listName)) { //$NON-NLS-1$ + builder.append(" ").append(listName).append(TaskAdapter.DETAIL_SEPARATOR); //$NON-NLS-1$ } int repeat = metadata.getValue(MilkTask.REPEATING); diff --git a/astrid/plugin-src/com/todoroo/astrid/rmilk/api/data/RtmTaskNote.java b/astrid/plugin-src/com/todoroo/astrid/rmilk/api/data/RtmTaskNote.java index 3e5875789..a12a42d40 100644 --- a/astrid/plugin-src/com/todoroo/astrid/rmilk/api/data/RtmTaskNote.java +++ b/astrid/plugin-src/com/todoroo/astrid/rmilk/api/data/RtmTaskNote.java @@ -1,106 +1,106 @@ -/* - * Copyright 2007, MetaDimensional Technologies Inc. - * - * - * This file is part of the RememberTheMilk Java API. - * - * The RememberTheMilk Java API is free software; you can redistribute it - * and/or modify it under the terms of the GNU Lesser General Public License - * as published by the Free Software Foundation; either version 3 of the - * License, or (at your option) any later version. - * - * The RememberTheMilk Java API is distributed in the hope that it will be - * useful, but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU Lesser - * General Public License for more details. - * - * You should have received a copy of the GNU Lesser General Public License - * along with this program. If not, see . - */ -package com.todoroo.astrid.rmilk.api.data; - -import java.util.Date; - -import org.w3c.dom.Element; -import org.w3c.dom.EntityReference; -import org.w3c.dom.Text; - -import android.util.Log; - -/** - * Represents a single task note. - * - * @author Edouard Mercier - * @since 2008.04.22 - */ -@SuppressWarnings("nls") -public class RtmTaskNote - extends RtmData -{ - - private final String id; - - private final Date created; - - private final Date modified; - - private final String title; - - private String text; - - public RtmTaskNote(Element element) - { - id = element.getAttribute("id"); - created = parseDate(element.getAttribute("created")); - modified = parseDate(element.getAttribute("modified")); - title = element.getAttribute("title"); - - // The note text itself might be split across multiple children of the - // note element, so get all of the children. - for (int i=0; i < element.getChildNodes().getLength(); i++) { - Object innerNote = element.getChildNodes().item(i); - - if(innerNote instanceof EntityReference) // this node is empty - continue; - - if(!(innerNote instanceof Text)) { - Log.w("rtm-note", "Expected text type, got " + innerNote.getClass()); - continue; - } - - Text innerText = (Text) innerNote; - - if (text == null) - text = innerText.getData(); - else - text = text.concat(innerText.getData()); - - } - } - - public String getId() - { - return id; - } - - public Date getCreated() - { - return created; - } - - public Date getModified() - { - return modified; - } - - public String getTitle() - { - return title; - } - - public String getText() - { - return text; - } - -} +/* + * Copyright 2007, MetaDimensional Technologies Inc. + * + * + * This file is part of the RememberTheMilk Java API. + * + * The RememberTheMilk Java API is free software; you can redistribute it + * and/or modify it under the terms of the GNU Lesser General Public License + * as published by the Free Software Foundation; either version 3 of the + * License, or (at your option) any later version. + * + * The RememberTheMilk Java API is distributed in the hope that it will be + * useful, but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU Lesser + * General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public License + * along with this program. If not, see . + */ +package com.todoroo.astrid.rmilk.api.data; + +import java.util.Date; + +import org.w3c.dom.Element; +import org.w3c.dom.EntityReference; +import org.w3c.dom.Text; + +import android.util.Log; + +/** + * Represents a single task note. + * + * @author Edouard Mercier + * @since 2008.04.22 + */ +@SuppressWarnings("nls") +public class RtmTaskNote + extends RtmData +{ + + private final String id; + + private final Date created; + + private final Date modified; + + private final String title; + + private String text; + + public RtmTaskNote(Element element) + { + id = element.getAttribute("id"); + created = parseDate(element.getAttribute("created")); + modified = parseDate(element.getAttribute("modified")); + title = element.getAttribute("title"); + + // The note text itself might be split across multiple children of the + // note element, so get all of the children. + for (int i=0; i < element.getChildNodes().getLength(); i++) { + Object innerNote = element.getChildNodes().item(i); + + if(innerNote instanceof EntityReference) // this node is empty + continue; + + if(!(innerNote instanceof Text)) { + Log.w("rtm-note", "Expected text type, got " + innerNote.getClass()); + continue; + } + + Text innerText = (Text) innerNote; + + if (text == null) + text = innerText.getData(); + else + text = text.concat(innerText.getData()); + + } + } + + public String getId() + { + return id; + } + + public Date getCreated() + { + return created; + } + + public Date getModified() + { + return modified; + } + + public String getTitle() + { + return title; + } + + public String getText() + { + return text; + } + +} diff --git a/astrid/plugin-src/com/todoroo/astrid/tags/TagDetailExposer.java b/astrid/plugin-src/com/todoroo/astrid/tags/TagDetailExposer.java index d8c4ea6fc..21172fe2e 100644 --- a/astrid/plugin-src/com/todoroo/astrid/tags/TagDetailExposer.java +++ b/astrid/plugin-src/com/todoroo/astrid/tags/TagDetailExposer.java @@ -7,7 +7,6 @@ import android.content.BroadcastReceiver; import android.content.Context; import android.content.Intent; -import com.timsu.astrid.R; import com.todoroo.astrid.api.AstridApiConstants; import com.todoroo.astrid.api.DetailExposer; @@ -49,7 +48,7 @@ public class TagDetailExposer extends BroadcastReceiver implements DetailExposer if(tagList.length() == 0) return null; - return context.getString(R.string.tag_TLA_detail, tagList); + return " " + tagList; //$NON-NLS-1$ } @Override diff --git a/astrid/res/drawable/ic_menu_rmilk.png b/astrid/res/drawable/ic_menu_rmilk.png deleted file mode 100644 index 12f9cf24a78ac4d40789783e21bcab25be4d9d16..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 2656 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 literal 0 HcmV?d00001 diff --git a/astrid/res/drawable/silk_user_gray.png b/astrid/res/drawable/silk_user_gray.png new file mode 100644 index 0000000000000000000000000000000000000000..20b8cdf7b8293ee123bd34cc4229826e13124e1d GIT binary patch literal 778 zcmV+l1NHogP)Px#24YJ`L;(K){{a7>y{D4^000SaNLh0L01FcU01FcV0GgZ_00007bV*G`2igb> z05&%?c2(*C00N3hL_t(I%cYWCNK5@8g`EoqbPjoehZ%l8{|Au#2ETL1qd< zVAe%ONzjlesV>sUi;O_}xGCuSBDxqtSQi?sNJ89IREAMfZn&gfthJ%ww(~#dbPhmaaBt6nD;okF-#?tMkyNBVr=W^nq~{mlto1?Q6nvXW zoY)YM|1yX9q7hr0c0;h&BD+Gdq7oDo6O4p$S5NI1*WH2BWiIXSJITu~9tvaF^=TFk zyM!Y3V(jLHN=u_lSr<_2t$XWti%pCeVKXz>!VxSp3Ma=P*LdDF_FS+0HNy7R82>0O zWyT)fh7Cn<1|FQj3@feRY5W%M&I;*p^HIz1Gu*E~h(@C}j^j=fLIyiJIxsagh1U8q z03iNm1?}za7#|;prfI{Bu}c#Z6U$WxZEbBN91agqN(U*W&~+WEs)7%9fi!f2=XvDw zd3Zb?XqtAGG1eE2MvYYfr8Jhy<<4|>cY_duL?Qt~2qZ~@EX$yjBAHC0R4O47iEy$k zU(_`1cs0W7a}7*x>ZI3_1cD$yQ52+7DdciFP)Z>P0_=7>6h(o}X2Z}PC+41wmUoQ2 z=YKljIASncu(-GgtJMm|7<@h-g25mNA@KYC5JeH8Pzc#<7Q|o#rJSi6frMHHQZF7b zUDq)=ISGr!0!fnKcDrFRnc#Ff;q`hkJw1&=p@7uO(Xz0ud3e - - - - - - - - - - - - - - - - - - - - - - + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/astrid/res/layout/task_edit_activity.xml b/astrid/res/layout/task_edit_activity.xml index bf3218e7c..e6fdb48b2 100644 --- a/astrid/res/layout/task_edit_activity.xml +++ b/astrid/res/layout/task_edit_activity.xml @@ -1,304 +1,304 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -