From fa844146764e0bcf308950c639fc0630be5b92a1 Mon Sep 17 00:00:00 2001 From: Tim Su Date: Mon, 19 Jul 2010 21:47:24 -0700 Subject: [PATCH] Awesome! timer works like it should. No notification yet... --- astrid/AndroidManifest.xml | 13 +++ .../com/todoroo/astrid/api/Filter.java | 8 ++ .../todoroo/astrid/api/TaskDecoration.java | 11 --- astrid/astrid.launch | 2 +- .../todoroo/astrid/core/PluginServices.java | 28 +++++++ .../astrid/gcal/GCalTaskCompleteListener.java | 11 +-- .../astrid/notes/NoteDetailExposer.java | 20 +---- .../astrid/repeats/RepeatDetailExposer.java | 20 +---- .../astrid/timers/TimerActionExposer.java | 37 ++++---- .../astrid/timers/TimerDecorationExposer.java | 79 +++++------------- .../astrid/timers/TimerFilterExposer.java | 71 ++++++++++++++++ .../timers/TimerTaskCompleteListener.java | 40 +++++++++ astrid/res/drawable/tango_clock.png | Bin 0 -> 1411 bytes astrid/res/layout/timer_decoration.xml | 7 +- astrid/res/values/strings-timers.xml | 6 ++ .../astrid/activity/TaskListActivity.java | 5 +- .../todoroo/astrid/adapter/TaskAdapter.java | 11 +++ .../todoroo/astrid/service/TaskService.java | 15 +++- 18 files changed, 244 insertions(+), 140 deletions(-) create mode 100644 astrid/plugin-src/com/todoroo/astrid/core/PluginServices.java create mode 100644 astrid/plugin-src/com/todoroo/astrid/timers/TimerFilterExposer.java create mode 100644 astrid/plugin-src/com/todoroo/astrid/timers/TimerTaskCompleteListener.java create mode 100644 astrid/res/drawable/tango_clock.png diff --git a/astrid/AndroidManifest.xml b/astrid/AndroidManifest.xml index f38144f62..553a7bb4f 100644 --- a/astrid/AndroidManifest.xml +++ b/astrid/AndroidManifest.xml @@ -218,6 +218,19 @@ + + + + + + + + + + + + + diff --git a/astrid/api-src/com/todoroo/astrid/api/Filter.java b/astrid/api-src/com/todoroo/astrid/api/Filter.java index 404f5c075..9c8c258c8 100644 --- a/astrid/api-src/com/todoroo/astrid/api/Filter.java +++ b/astrid/api-src/com/todoroo/astrid/api/Filter.java @@ -22,6 +22,14 @@ import com.todoroo.andlib.sql.QueryTemplate; */ public final class Filter extends FilterListItem { + // --- constants + + /** Constant for valuesForNewTasks to indicate the value should be replaced + * with the current time as long */ + public static final long VALUE_NOW = Long.MIN_VALUE + 1; + + // --- instance variables + /** * Expanded title of this filter. This is displayed at the top * of the screen when user is viewing this filter. diff --git a/astrid/api-src/com/todoroo/astrid/api/TaskDecoration.java b/astrid/api-src/com/todoroo/astrid/api/TaskDecoration.java index bf0e0d096..e1cf4115c 100644 --- a/astrid/api-src/com/todoroo/astrid/api/TaskDecoration.java +++ b/astrid/api-src/com/todoroo/astrid/api/TaskDecoration.java @@ -3,7 +3,6 @@ */ package com.todoroo.astrid.api; -import android.content.Intent; import android.os.Parcel; import android.os.Parcelable; import android.widget.RemoteViews; @@ -32,16 +31,6 @@ public final class TaskDecoration implements Parcelable { */ public RemoteViews decoration = null; - /** - * Decoration update interval (minimum of 1000 millis), 0 to never update - */ - public long updateInterval = 0; - - /** - * Intent to call to update the decoration - */ - public Intent updateIntent = null; - /** * Decoration position */ diff --git a/astrid/astrid.launch b/astrid/astrid.launch index 7763a5bfc..065607e32 100644 --- a/astrid/astrid.launch +++ b/astrid/astrid.launch @@ -4,7 +4,7 @@ - + diff --git a/astrid/plugin-src/com/todoroo/astrid/core/PluginServices.java b/astrid/plugin-src/com/todoroo/astrid/core/PluginServices.java new file mode 100644 index 000000000..d2e348553 --- /dev/null +++ b/astrid/plugin-src/com/todoroo/astrid/core/PluginServices.java @@ -0,0 +1,28 @@ +package com.todoroo.astrid.core; + +import com.todoroo.andlib.service.Autowired; +import com.todoroo.andlib.service.DependencyInjectionService; +import com.todoroo.astrid.service.TaskService; + +public final class PluginServices { + + @Autowired + TaskService taskService; + + private static PluginServices instance; + + private PluginServices() { + DependencyInjectionService.getInstance().inject(this); + } + + private synchronized static PluginServices getInstance() { + if(instance == null) + instance = new PluginServices(); + return instance; + } + + public static TaskService getTaskService() { + return getInstance().taskService; + } + +} diff --git a/astrid/plugin-src/com/todoroo/astrid/gcal/GCalTaskCompleteListener.java b/astrid/plugin-src/com/todoroo/astrid/gcal/GCalTaskCompleteListener.java index 685598f0c..80f3de628 100644 --- a/astrid/plugin-src/com/todoroo/astrid/gcal/GCalTaskCompleteListener.java +++ b/astrid/plugin-src/com/todoroo/astrid/gcal/GCalTaskCompleteListener.java @@ -9,17 +9,12 @@ import android.net.Uri; import android.text.TextUtils; import com.timsu.astrid.R; -import com.todoroo.andlib.service.Autowired; -import com.todoroo.andlib.service.DependencyInjectionService; import com.todoroo.astrid.api.AstridApiConstants; +import com.todoroo.astrid.core.PluginServices; import com.todoroo.astrid.model.Task; -import com.todoroo.astrid.service.TaskService; public class GCalTaskCompleteListener extends BroadcastReceiver { - @Autowired - private TaskService taskService; - @SuppressWarnings("nls") @Override public void onReceive(Context context, Intent intent) { @@ -27,9 +22,7 @@ public class GCalTaskCompleteListener extends BroadcastReceiver { if(taskId == -1) return; - DependencyInjectionService.getInstance().inject(this); - - Task task = taskService.fetchById(taskId, Task.ID, Task.TITLE, Task.CALENDAR_URI); + Task task = PluginServices.getTaskService().fetchById(taskId, Task.ID, Task.TITLE, Task.CALENDAR_URI); if(task == null) return; diff --git a/astrid/plugin-src/com/todoroo/astrid/notes/NoteDetailExposer.java b/astrid/plugin-src/com/todoroo/astrid/notes/NoteDetailExposer.java index f96d15eb4..2a14ed1e6 100644 --- a/astrid/plugin-src/com/todoroo/astrid/notes/NoteDetailExposer.java +++ b/astrid/plugin-src/com/todoroo/astrid/notes/NoteDetailExposer.java @@ -7,12 +7,10 @@ import android.content.BroadcastReceiver; import android.content.Context; import android.content.Intent; -import com.todoroo.andlib.service.Autowired; -import com.todoroo.andlib.service.DependencyInjectionService; import com.todoroo.astrid.api.AstridApiConstants; import com.todoroo.astrid.api.DetailExposer; +import com.todoroo.astrid.core.PluginServices; import com.todoroo.astrid.model.Task; -import com.todoroo.astrid.service.TaskService; /** * Exposes Task Detail for notes @@ -22,11 +20,6 @@ import com.todoroo.astrid.service.TaskService; */ public class NoteDetailExposer extends BroadcastReceiver implements DetailExposer { - private static TaskService staticTaskService; - - @Autowired - private TaskService taskService; - @Override public void onReceive(Context context, Intent intent) { // get tags associated with this task @@ -53,16 +46,7 @@ public class NoteDetailExposer extends BroadcastReceiver implements DetailExpose if(!extended) return null; - synchronized(NoteDetailExposer.class) { - if(staticTaskService == null) { - DependencyInjectionService.getInstance().inject(this); - staticTaskService = taskService; - } else { - taskService = staticTaskService; - } - } - - Task task = taskService.fetchById(id, Task.NOTES); + Task task = PluginServices.getTaskService().fetchById(id, Task.NOTES); if(task == null) return null; String notes = task.getValue(Task.NOTES); diff --git a/astrid/plugin-src/com/todoroo/astrid/repeats/RepeatDetailExposer.java b/astrid/plugin-src/com/todoroo/astrid/repeats/RepeatDetailExposer.java index 78b274e84..46d3af6f7 100644 --- a/astrid/plugin-src/com/todoroo/astrid/repeats/RepeatDetailExposer.java +++ b/astrid/plugin-src/com/todoroo/astrid/repeats/RepeatDetailExposer.java @@ -16,12 +16,10 @@ import com.google.ical.values.Frequency; import com.google.ical.values.RRule; import com.google.ical.values.WeekdayNum; import com.timsu.astrid.R; -import com.todoroo.andlib.service.Autowired; -import com.todoroo.andlib.service.DependencyInjectionService; import com.todoroo.astrid.api.AstridApiConstants; import com.todoroo.astrid.api.DetailExposer; +import com.todoroo.astrid.core.PluginServices; import com.todoroo.astrid.model.Task; -import com.todoroo.astrid.service.TaskService; /** * Exposes Task Detail for repeats, i.e. "Repeats every 2 days" @@ -31,11 +29,6 @@ import com.todoroo.astrid.service.TaskService; */ public class RepeatDetailExposer extends BroadcastReceiver implements DetailExposer { - private static TaskService staticTaskService = null; - - @Autowired - TaskService taskService; - @Override public void onReceive(Context context, Intent intent) { // get tags associated with this task @@ -61,16 +54,7 @@ public class RepeatDetailExposer extends BroadcastReceiver implements DetailExpo if(extended) return null; - synchronized(RepeatDetailExposer.class) { - if(staticTaskService == null) { - DependencyInjectionService.getInstance().inject(this); - staticTaskService = taskService; - } else { - taskService = staticTaskService; - } - } - - Task task = taskService.fetchById(id, Task.FLAGS, Task.RECURRENCE); + Task task = PluginServices.getTaskService().fetchById(id, Task.FLAGS, Task.RECURRENCE); if(task == null) return null; diff --git a/astrid/plugin-src/com/todoroo/astrid/timers/TimerActionExposer.java b/astrid/plugin-src/com/todoroo/astrid/timers/TimerActionExposer.java index c7122c8a7..373091982 100644 --- a/astrid/plugin-src/com/todoroo/astrid/timers/TimerActionExposer.java +++ b/astrid/plugin-src/com/todoroo/astrid/timers/TimerActionExposer.java @@ -9,14 +9,12 @@ import android.content.Context; import android.content.Intent; import com.timsu.astrid.R; -import com.todoroo.andlib.service.Autowired; -import com.todoroo.andlib.service.DependencyInjectionService; import com.todoroo.andlib.utility.DateUtilities; import com.todoroo.astrid.api.AstridApiConstants; import com.todoroo.astrid.api.TaskAction; import com.todoroo.astrid.api.TaskDecoration; +import com.todoroo.astrid.core.PluginServices; import com.todoroo.astrid.model.Task; -import com.todoroo.astrid.service.TaskService; /** * Exposes {@link TaskDecoration} for timers @@ -26,8 +24,7 @@ import com.todoroo.astrid.service.TaskService; */ public class TimerActionExposer extends BroadcastReceiver { - @Autowired - private TaskService taskService; + private static final String TIMER_ACTION = "com.todoroo.astrid.TIMER_BUTTON"; //$NON-NLS-1$ @Override public void onReceive(Context context, Intent intent) { @@ -35,16 +32,8 @@ public class TimerActionExposer extends BroadcastReceiver { if(taskId == -1) return; - synchronized(TimerDecorationExposer.class) { - if(TimerDecorationExposer.staticTaskService == null) { - DependencyInjectionService.getInstance().inject(this); - TimerDecorationExposer.staticTaskService = taskService; - } else { - taskService = TimerDecorationExposer.staticTaskService; - } - } - - Task task = taskService.fetchById(taskId, Task.TIMER_START); + Task task = PluginServices.getTaskService().fetchById(taskId, Task.ID, Task.TIMER_START, + Task.ELAPSED_SECONDS); // was part of a broadcast for actions if(AstridApiConstants.BROADCAST_REQUEST_ACTIONS.equals(intent.getAction())) { @@ -53,7 +42,8 @@ public class TimerActionExposer extends BroadcastReceiver { label = context.getString(R.string.TAE_startTimer); else label = context.getString(R.string.TAE_stopTimer); - Intent newIntent = new Intent(context, TimerActionExposer.class); + Intent newIntent = new Intent(TIMER_ACTION); + newIntent.putExtra(AstridApiConstants.EXTRAS_TASK_ID, taskId); TaskAction action = new TaskAction(label, PendingIntent.getBroadcast(context, 0, newIntent, 0)); @@ -63,13 +53,20 @@ public class TimerActionExposer extends BroadcastReceiver { broadcastIntent.putExtra(AstridApiConstants.EXTRAS_RESPONSE, action); broadcastIntent.putExtra(AstridApiConstants.EXTRAS_TASK_ID, taskId); context.sendBroadcast(broadcastIntent, AstridApiConstants.PERMISSION_READ); - } else { + } else if(TIMER_ACTION.equals(intent.getAction())) { // toggle the timer if(task.getValue(Task.TIMER_START) == 0) task.setValue(Task.TIMER_START, DateUtilities.now()); - else - task.setValue(Task.TIMER_START, 0L); - taskService.save(task, true); + else { + TimerTaskCompleteListener.stopTimer(task); + } + PluginServices.getTaskService().save(task, true); + TimerDecorationExposer.removeFromCache(taskId); + + // transmit new intents TimerDecoration + new TimerDecorationExposer().onReceive(context, intent); + intent.setAction(AstridApiConstants.BROADCAST_REQUEST_ACTIONS); + onReceive(context, intent); } } diff --git a/astrid/plugin-src/com/todoroo/astrid/timers/TimerDecorationExposer.java b/astrid/plugin-src/com/todoroo/astrid/timers/TimerDecorationExposer.java index 9093f1c34..b8b980b7c 100644 --- a/astrid/plugin-src/com/todoroo/astrid/timers/TimerDecorationExposer.java +++ b/astrid/plugin-src/com/todoroo/astrid/timers/TimerDecorationExposer.java @@ -4,21 +4,20 @@ package com.todoroo.astrid.timers; import java.util.HashMap; -import java.util.Timer; -import java.util.TimerTask; import android.content.BroadcastReceiver; import android.content.Context; import android.content.Intent; import android.graphics.Color; +import android.os.SystemClock; import android.widget.RemoteViews; import com.timsu.astrid.R; -import com.todoroo.andlib.service.Autowired; -import com.todoroo.andlib.service.DependencyInjectionService; +import com.todoroo.andlib.utility.DateUtilities; import com.todoroo.astrid.api.AstridApiConstants; import com.todoroo.astrid.api.TaskDecoration; -import com.todoroo.astrid.service.TaskService; +import com.todoroo.astrid.core.PluginServices; +import com.todoroo.astrid.model.Task; /** * Exposes {@link TaskDecoration} for timers @@ -28,50 +27,13 @@ import com.todoroo.astrid.service.TaskService; */ public class TimerDecorationExposer extends BroadcastReceiver { - private static final int TASK_BG_COLOR = Color.argb(200, 220, 50, 0); + private static final int TIMING_BG_COLOR = Color.argb(200, 220, 50, 0); - static TaskService staticTaskService; private static HashMap decorations = new HashMap(); - private static HashMap timers = - new HashMap(); - @Autowired - private TaskService taskService; - - private static class TimerTimerTask extends TimerTask { - int time; - RemoteViews remoteViews; - - public TimerTimerTask(int time, RemoteViews remoteViews) { - super(); - this.time = time; - this.remoteViews = remoteViews; - } - - @Override - public void run() { - time++; - int seconds = time % 60; - int minutes = time / 60; - if(minutes > 59) { - int hours = minutes / 60; - minutes %= 60; - remoteViews.setTextViewText(R.id.timer, - String.format("%02d:%02d:%02d", //$NON-NLS-1$ - hours, minutes, seconds)); - } else { - remoteViews.setTextViewText(R.id.timer, - String.format("%02d:%02d", //$NON-NLS-1$ - minutes, seconds)); - } - } - } - - public void removeFromCache(long taskId) { + public static void removeFromCache(long taskId) { decorations.remove(taskId); - timers.get(taskId).cancel(); - timers.remove(taskId); } @Override @@ -80,31 +42,32 @@ public class TimerDecorationExposer extends BroadcastReceiver { if(taskId == -1) return; - synchronized(TimerDecorationExposer.class) { - if(staticTaskService == null) { - DependencyInjectionService.getInstance().inject(this); - staticTaskService = taskService; - } else { - taskService = staticTaskService; - } - } + Task task = PluginServices.getTaskService().fetchById(taskId, Task.ELAPSED_SECONDS, Task.TIMER_START); + if(task == null || (task.getValue(Task.ELAPSED_SECONDS) == 0 && + task.getValue(Task.TIMER_START) == 0)) + return; TaskDecoration decoration; - if(!decorations.containsKey(taskId)) { RemoteViews remoteViews = new RemoteViews(context.getPackageName(), R.layout.timer_decoration); decoration = new TaskDecoration(remoteViews, - TaskDecoration.POSITION_LEFT, TASK_BG_COLOR); + TaskDecoration.POSITION_LEFT, 0); decorations.put(taskId, decoration); - Timer timer = new Timer(); - timers.put(taskId, timer); - timer.scheduleAtFixedRate(new TimerTimerTask(0, - remoteViews), 0, 1000L); } else { decoration = decorations.get(taskId); } + long elapsed = task.getValue(Task.ELAPSED_SECONDS) * 1000L; + if(task.getValue(Task.TIMER_START) != 0) { + decoration.color = TIMING_BG_COLOR; + elapsed += DateUtilities.now() - task.getValue(Task.TIMER_START); + } + + // update timer + decoration.decoration.setChronometer(R.id.timer, SystemClock.elapsedRealtime() - + elapsed, null, decoration.color != 0); + // transmit Intent broadcastIntent = new Intent(AstridApiConstants.BROADCAST_SEND_DECORATIONS); broadcastIntent.putExtra(AstridApiConstants.EXTRAS_ADDON, TimerPlugin.IDENTIFIER); diff --git a/astrid/plugin-src/com/todoroo/astrid/timers/TimerFilterExposer.java b/astrid/plugin-src/com/todoroo/astrid/timers/TimerFilterExposer.java new file mode 100644 index 000000000..0bb994146 --- /dev/null +++ b/astrid/plugin-src/com/todoroo/astrid/timers/TimerFilterExposer.java @@ -0,0 +1,71 @@ +/** + * See the file "LICENSE" for the full license governing this code. + */ +package com.todoroo.astrid.timers; + +import android.content.BroadcastReceiver; +import android.content.ContentValues; +import android.content.Context; +import android.content.Intent; +import android.content.res.Resources; +import android.graphics.drawable.BitmapDrawable; + +import com.timsu.astrid.R; +import com.todoroo.andlib.sql.Criterion; +import com.todoroo.andlib.sql.Query; +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.core.PluginServices; +import com.todoroo.astrid.dao.TaskDao.TaskCriteria; +import com.todoroo.astrid.model.Task; + +/** + * Exposes "working on" filter to the {@link FilterListActivity} + * + * @author Tim Su + * + */ +public final class TimerFilterExposer extends BroadcastReceiver { + + @Override + public void onReceive(Context context, Intent intent) { + Resources r = context.getResources(); + + if(PluginServices.getTaskService().count(Query.select(Task.ID). + where(Task.TIMER_START.gt(0))) == 0) + return; + + ContentValues values = new ContentValues(); + values.put(Task.TIMER_START.name, Filter.VALUE_NOW); + Filter workingOn = new Filter(r.getString(R.string.TFE_workingOn), + r.getString(R.string.TFE_workingOn), + new QueryTemplate().where(Task.TIMER_START.gt(0)), + values); + workingOn.listingIcon = ((BitmapDrawable)r.getDrawable(R.drawable.tango_clock)).getBitmap(); + + // transmit filter list + FilterListItem[] list = new FilterListItem[1]; + list[0] = workingOn; + Intent broadcastIntent = new Intent(AstridApiConstants.BROADCAST_SEND_FILTERS); + broadcastIntent.putExtra(AstridApiConstants.EXTRAS_RESPONSE, list); + context.sendBroadcast(broadcastIntent, AstridApiConstants.PERMISSION_READ); + } + + /** + * Build inbox filter + * @return + */ + public static Filter buildInboxFilter(Resources r) { + Filter inbox = new Filter(r.getString(R.string.BFE_Active), r.getString(R.string.BFE_Active_title), + new QueryTemplate().where(Criterion.and(TaskCriteria.isActive(), + TaskCriteria.isVisible(DateUtilities.now()))), + null); + inbox.listingIcon = ((BitmapDrawable)r.getDrawable(R.drawable.tango_home)).getBitmap(); + return inbox; + } + +} diff --git a/astrid/plugin-src/com/todoroo/astrid/timers/TimerTaskCompleteListener.java b/astrid/plugin-src/com/todoroo/astrid/timers/TimerTaskCompleteListener.java new file mode 100644 index 000000000..6f8404496 --- /dev/null +++ b/astrid/plugin-src/com/todoroo/astrid/timers/TimerTaskCompleteListener.java @@ -0,0 +1,40 @@ +package com.todoroo.astrid.timers; + +import android.content.BroadcastReceiver; +import android.content.Context; +import android.content.Intent; + +import com.todoroo.andlib.utility.DateUtilities; +import com.todoroo.astrid.api.AstridApiConstants; +import com.todoroo.astrid.core.PluginServices; +import com.todoroo.astrid.model.Task; + +public class TimerTaskCompleteListener extends BroadcastReceiver { + + /** + * stops timer and sets elapsed time. you still need to save the task. + * @param task + */ + public static void stopTimer(Task task) { + int newElapsed = (int)((DateUtilities.now() - task.getValue(Task.TIMER_START)) / 1000L); + task.setValue(Task.TIMER_START, 0L); + task.setValue(Task.ELAPSED_SECONDS, + task.getValue(Task.ELAPSED_SECONDS) + newElapsed); + } + + @Override + public void onReceive(Context context, Intent intent) { + long taskId = intent.getLongExtra(AstridApiConstants.EXTRAS_TASK_ID, -1); + if(taskId == -1) + return; + + Task task = PluginServices.getTaskService().fetchById(taskId, Task.ID, Task.ELAPSED_SECONDS, + Task.TIMER_START); + if(task == null || task.getValue(Task.TIMER_START) == 0) + return; + + stopTimer(task); + PluginServices.getTaskService().save(task, true); + } + +} diff --git a/astrid/res/drawable/tango_clock.png b/astrid/res/drawable/tango_clock.png new file mode 100644 index 0000000000000000000000000000000000000000..d676ffd4632b2e2271a9906e6d871eed2c14df31 GIT binary patch literal 1411 zcmV-}1$_F6P)#?6Cz*=ZsGs{1rSL@ zK~y-)eU)8oTt^khe>3;)-L==d{#bisH*r3kIM|59#&w&xrKlj`A}S=3D(wR=RDI|J zs!#z5$?(iWMO7YV+C}2&uOX#iXt*B{?#JfuSk5tl{ney0r;ywj6j~pUTVPAdmmV8G!c1m?@$oSd ziB^2~Hqvr1%B3x`h;3U4ArL~KlpzvrCK@{gq5yhPRLZ58FjSFZMFM>9#Kfx)jvbDz zx@Cq&K8IF5m5NJu-%|(yDkxxr0zx_sun-pYdJ`cBu*ApsrC(FXPdWd6r!R*T|CRs| z%RbgW*oSW_q|+&+ogk@1^V=VtL`);?37b zdqvYi!3MAtsdzF@wB}-rK`DjpB-y=pfcd#8`uZQ_>X|QLjA=lPF&HDLhF?bOQPxUj zlJO|I_F*r8{LV8!uyv?xDFu6W?__ED7C{i8wZ>r6vul8>|9OLqIaeuZMGisQs_92+zafCO5$yokme?qrtnDjr&Elu{_A=-Kx;0JF2RoH+6HHgKW1 z!A4=7L~F~oinD>Duq~yvu{_UbWcVQflv0h*GnotkgM)*dK79(Ub;G(kcc7FaVn^__ z!AKDT$di9~*_eo|cqNbZe6b-=N)d)3uIn;9JOV&2m*wcuquan*Yhtk`Dz1-L@=!t- zwo*Y=)u-oX=aChI5OP}@cJ0~?KsI}~v9@JfU@0ZHuP-q-J5Sw&=Ne#F2G31hyrvV8 zW-?3J%>uY5o}4^GCbN8Bs8WiKjufkzbvhHRy!Y<3@*?Va01M#C%!RctetvAMy5S!< z*tZWm;UF!6)|zxWjWLF5t=f2ITb_1wq^OjAbiU5plNVULyZpP?{`|@t4KN^P=CAy7 zPkP{4+lZ#lL_5Zjw6(Vph5^RFt)&H&QY2bhiAEig$yTy=@&wr`m*1V{(&g!uU!H#D zc|ZaF7C0J)L2I#Ao{E~}ljYTt)6?07?^m%RHu07?-8*_nwWo+g9P)QJ$j;{wuHx;< z3%qybTJiViPQFmBRZ4&ll()bJXwI*%gwr=K|D&y?dvxyog?14b5yK%U1^D?2Ue3eK zx>Ry5bJI8Z+n>&vYYVd<{$}#kpZHZT2NZ!7p#I7K*a02@(m?tP0}qWoJn+b~sd&c@ zQwt^G=09Nxv@O({x1Kxw&L4lVQOqp@d0-W|36$>Fngq}WbOY@`GSSl3xwCuk{;pI{ zf3@bjtNF~*?K^X~j4>6U3>1K6AP0n>+4DXTLDQziHfMl3P~FU>2h{E-{vR + android:layout_height="fill_parent" + android:orientation="vertical" + android:paddingLeft="3px"> - diff --git a/astrid/res/values/strings-timers.xml b/astrid/res/values/strings-timers.xml index ca97fc583..1e1c695c5 100644 --- a/astrid/res/values/strings-timers.xml +++ b/astrid/res/values/strings-timers.xml @@ -12,5 +12,11 @@ Elapsed Time: %s + + + Timer Filters + + + Tasks Being Timed diff --git a/astrid/src/com/todoroo/astrid/activity/TaskListActivity.java b/astrid/src/com/todoroo/astrid/activity/TaskListActivity.java index d63465e73..f5730dd7a 100644 --- a/astrid/src/com/todoroo/astrid/activity/TaskListActivity.java +++ b/astrid/src/com/todoroo/astrid/activity/TaskListActivity.java @@ -46,6 +46,7 @@ import com.todoroo.andlib.service.Autowired; import com.todoroo.andlib.service.DependencyInjectionService; import com.todoroo.andlib.service.ExceptionService; import com.todoroo.andlib.utility.AndroidUtilities; +import com.todoroo.andlib.utility.DateUtilities; import com.todoroo.andlib.utility.DialogUtilities; import com.todoroo.andlib.utility.Pair; import com.todoroo.astrid.adapter.TaskAdapter; @@ -325,6 +326,8 @@ public class TaskListActivity extends ListActivity implements OnScrollListener { ContentValues forTask = new ContentValues(); forMetadata = new ContentValues(); for(Entry item : filter.valuesForNewTasks.valueSet()) { + if(Long.valueOf(Filter.VALUE_NOW).equals(item.getValue())) + item.setValue(DateUtilities.now()); if(item.getKey().startsWith(Task.TABLE.name)) AndroidUtilities.putInto(forTask, item.getKey(), item.getValue()); else @@ -415,7 +418,7 @@ public class TaskListActivity extends ListActivity implements OnScrollListener { else taskAdapter.extendedDetailManager.addNew(taskId, addOn, detail); } else if(AstridApiConstants.BROADCAST_SEND_ACTIONS.equals(intent.getAction())) { - TaskAction action = extras.getParcelable(AstridApiConstants.BROADCAST_SEND_ACTIONS); + TaskAction action = extras.getParcelable(AstridApiConstants.EXTRAS_RESPONSE); taskAdapter.taskActionManager.addNew(taskId, addOn, action); } } catch (Exception e) { diff --git a/astrid/src/com/todoroo/astrid/adapter/TaskAdapter.java b/astrid/src/com/todoroo/astrid/adapter/TaskAdapter.java index fe1aa4c12..5c803eb96 100644 --- a/astrid/src/com/todoroo/astrid/adapter/TaskAdapter.java +++ b/astrid/src/com/todoroo/astrid/adapter/TaskAdapter.java @@ -15,6 +15,7 @@ import android.database.Cursor; import android.graphics.Color; import android.graphics.Paint; import android.text.Html; +import android.util.Log; import android.view.ContextMenu; import android.view.ContextMenu.ContextMenuInfo; import android.view.LayoutInflater; @@ -320,6 +321,7 @@ public class TaskAdapter extends CursorAdapter { detailManager.clearCache(); extendedDetailManager.clearCache(); decorationManager.clearCache(); + taskActionManager.clearCache(); } /** @@ -524,6 +526,7 @@ public class TaskAdapter extends CursorAdapter { Task task = viewHolder.task; completeTask(task, ((CheckBox)v).isChecked()); + // set check box to actual action item state setTaskAppearance(viewHolder, task.isCompleted()); } @@ -539,8 +542,13 @@ public class TaskAdapter extends CursorAdapter { public void onClick(View v) { try { action.intent.send(); + + // refresh ourselves + getCursor().requery(); + notifyDataSetChanged(); } catch (Exception e) { // oh too bad. + Log.i("astrid-action-error", "Error launching intent", e); //$NON-NLS-1$ //$NON-NLS-2$ } } }; @@ -562,6 +570,9 @@ public class TaskAdapter extends CursorAdapter { if(viewHolder.expanded) { extendedDetailManager.request(viewHolder); taskActionManager.request(viewHolder); + } else { + viewHolder.extendedDetails.setVisibility(View.GONE); + viewHolder.actions.setVisibility(View.GONE); } } } diff --git a/astrid/src/com/todoroo/astrid/service/TaskService.java b/astrid/src/com/todoroo/astrid/service/TaskService.java index 9ae6ec64e..e29ea62c8 100644 --- a/astrid/src/com/todoroo/astrid/service/TaskService.java +++ b/astrid/src/com/todoroo/astrid/service/TaskService.java @@ -10,8 +10,8 @@ import com.todoroo.andlib.sql.Query; import com.todoroo.andlib.utility.DateUtilities; import com.todoroo.astrid.api.Filter; import com.todoroo.astrid.dao.MetadataDao; -import com.todoroo.astrid.dao.TaskDao; import com.todoroo.astrid.dao.MetadataDao.MetadataCriteria; +import com.todoroo.astrid.dao.TaskDao; import com.todoroo.astrid.dao.TaskDao.TaskCriteria; import com.todoroo.astrid.model.Metadata; import com.todoroo.astrid.model.Task; @@ -173,6 +173,19 @@ public class TaskService { Task.IMPORTANCE + " + " + Task.COMPLETION_DATE); } + /** + * @param query + * @return how many tasks are matched by this query + */ + public int count(Query query) { + TodorooCursor cursor = taskDao.query(query); + try { + return cursor.getCount(); + } finally { + cursor.close(); + } + } + }