From 728e1bb2f4ff93c923828cfb58e0a4f2c1ba47fa Mon Sep 17 00:00:00 2001 From: Tim Su Date: Mon, 26 Jul 2010 20:17:51 -0700 Subject: [PATCH] Fix for three issues - fling task adapter showed old junk - timer would show wrong time when remoteview reinstantiated - due date filter was wrong --- astrid/AndroidManifest.xml | 2 + .../com/todoroo/andlib/sql/Functions.java | 4 +- .../andlib/utility/AndroidUtilities.java | 23 +++++++++ .../astrid/core/CoreFilterExposer.java | 2 +- .../astrid/timers/TimerDecorationExposer.java | 16 ++++-- .../todoroo/astrid/adapter/TaskAdapter.java | 50 +++++++++++++------ 6 files changed, 77 insertions(+), 20 deletions(-) diff --git a/astrid/AndroidManifest.xml b/astrid/AndroidManifest.xml index 198d21dfd..b88ec4cf6 100644 --- a/astrid/AndroidManifest.xml +++ b/astrid/AndroidManifest.xml @@ -101,6 +101,8 @@ + + diff --git a/astrid/common-src/com/todoroo/andlib/sql/Functions.java b/astrid/common-src/com/todoroo/andlib/sql/Functions.java index 4099d3c72..fb4f964ee 100644 --- a/astrid/common-src/com/todoroo/andlib/sql/Functions.java +++ b/astrid/common-src/com/todoroo/andlib/sql/Functions.java @@ -5,9 +5,9 @@ package com.todoroo.andlib.sql; public final class Functions { public static String caseStatement(Criterion when, Object ifTrue, Object ifFalse) { - return new StringBuilder("CASE WHEN "). + return new StringBuilder("(CASE WHEN "). append(when.toString()).append(" THEN ").append(value(ifTrue)). - append(" ELSE ").append(value(ifFalse)).append(" END").toString(); + append(" ELSE ").append(value(ifFalse)).append(" END)").toString(); } private static String value(Object value) { diff --git a/astrid/common-src/com/todoroo/andlib/utility/AndroidUtilities.java b/astrid/common-src/com/todoroo/andlib/utility/AndroidUtilities.java index a1e4fd4a9..08cd18d9b 100644 --- a/astrid/common-src/com/todoroo/andlib/utility/AndroidUtilities.java +++ b/astrid/common-src/com/todoroo/andlib/utility/AndroidUtilities.java @@ -23,6 +23,7 @@ import android.text.InputType; import android.view.MotionEvent; import android.view.View; import android.view.View.OnTouchListener; +import android.view.ViewGroup; import android.widget.TextView; import com.todoroo.andlib.service.Autowired; @@ -253,4 +254,26 @@ public class AndroidUtilities { fos.close(); } } + + /** + * Find a child view of a certain type + * @param view + * @param type + * @return first view (by DFS) if found, or null if none + */ + public static TYPE findViewByType(View view, Class type) { + if(view == null) + return null; + if(type.isInstance(view)) + return (TYPE) view; + if(view instanceof ViewGroup) { + ViewGroup group = (ViewGroup) view; + for(int i = 0; i < group.getChildCount(); i++) { + TYPE v = findViewByType(group.getChildAt(i), type); + if(v != null) + return v; + } + } + return null; + } } diff --git a/astrid/plugin-src/com/todoroo/astrid/core/CoreFilterExposer.java b/astrid/plugin-src/com/todoroo/astrid/core/CoreFilterExposer.java index e75b4d4f6..1cf0b2df4 100644 --- a/astrid/plugin-src/com/todoroo/astrid/core/CoreFilterExposer.java +++ b/astrid/plugin-src/com/todoroo/astrid/core/CoreFilterExposer.java @@ -95,7 +95,7 @@ public final class CoreFilterExposer extends BroadcastReceiver { new QueryTemplate().where(Criterion.and(TaskCriteria.isActive(), TaskCriteria.isVisible())). orderBy(Order.asc(Functions.caseStatement(Task.DUE_DATE.eq(0), - Long.MAX_VALUE, Task.DUE_DATE) + "+" + Task.IMPORTANCE)), //$NON-NLS-1$ + DateUtilities.now()*2, Task.DUE_DATE) + "+" + Task.IMPORTANCE)), //$NON-NLS-1$ null); dueDate.listingIcon = ((BitmapDrawable)r.getDrawable(R.drawable.tango_calendar)).getBitmap(); diff --git a/astrid/plugin-src/com/todoroo/astrid/timers/TimerDecorationExposer.java b/astrid/plugin-src/com/todoroo/astrid/timers/TimerDecorationExposer.java index b8b980b7c..9fc908bae 100644 --- a/astrid/plugin-src/com/todoroo/astrid/timers/TimerDecorationExposer.java +++ b/astrid/plugin-src/com/todoroo/astrid/timers/TimerDecorationExposer.java @@ -10,6 +10,7 @@ import android.content.Context; import android.content.Intent; import android.graphics.Color; import android.os.SystemClock; +import android.text.format.DateUtils; import android.widget.RemoteViews; import com.timsu.astrid.R; @@ -62,11 +63,16 @@ public class TimerDecorationExposer extends BroadcastReceiver { if(task.getValue(Task.TIMER_START) != 0) { decoration.color = TIMING_BG_COLOR; elapsed += DateUtilities.now() - task.getValue(Task.TIMER_START); + decoration.decoration.setChronometer(R.id.timer, SystemClock.elapsedRealtime() - + elapsed, null, true); + } else { + // if timer is not started, make the chronometer just a text label, + // since we don't want the time to be displayed relative to elapsed + String format = buildFormat(elapsed); + decoration.decoration.setChronometer(R.id.timer, SystemClock.elapsedRealtime() - + elapsed, format, false); } - // update timer - decoration.decoration.setChronometer(R.id.timer, SystemClock.elapsedRealtime() - - elapsed, null, decoration.color != 0); // transmit Intent broadcastIntent = new Intent(AstridApiConstants.BROADCAST_SEND_DECORATIONS); @@ -76,4 +82,8 @@ public class TimerDecorationExposer extends BroadcastReceiver { context.sendBroadcast(broadcastIntent, AstridApiConstants.PERMISSION_READ); } + private String buildFormat(long elapsed) { + return DateUtils.formatElapsedTime(elapsed / 1000L); + } + } diff --git a/astrid/src/com/todoroo/astrid/adapter/TaskAdapter.java b/astrid/src/com/todoroo/astrid/adapter/TaskAdapter.java index 5a2c78bef..e781d48ca 100644 --- a/astrid/src/com/todoroo/astrid/adapter/TaskAdapter.java +++ b/astrid/src/com/todoroo/astrid/adapter/TaskAdapter.java @@ -15,12 +15,12 @@ import android.graphics.Color; import android.graphics.Paint; import android.text.Html; import android.view.ContextMenu; +import android.view.ContextMenu.ContextMenuInfo; import android.view.LayoutInflater; import android.view.View; -import android.view.ViewGroup; -import android.view.ContextMenu.ContextMenuInfo; import android.view.View.OnClickListener; import android.view.View.OnCreateContextMenuListener; +import android.view.ViewGroup; import android.view.ViewGroup.LayoutParams; import android.widget.Button; import android.widget.CheckBox; @@ -300,6 +300,10 @@ public class TaskAdapter extends CursorAdapter { viewHolder.extendedDetails.setVisibility(View.GONE); viewHolder.actions.setVisibility(View.GONE); } + } else { + long taskId = viewHolder.task.getId(); + detailManager.reset(viewHolder, taskId); + decorationManager.reset(viewHolder, taskId); } } @@ -393,8 +397,8 @@ public class TaskAdapter extends CursorAdapter { if(details == null || viewHolder.task.getId() != taskId) return; TextView view = extended ? viewHolder.extendedDetails : viewHolder.details; + reset(viewHolder, taskId); if(details.isEmpty() || (extended && expanded != taskId)) { - view.setVisibility(View.GONE); return; } view.setVisibility(View.VISIBLE); @@ -411,6 +415,11 @@ public class TaskAdapter extends CursorAdapter { view.setText(string.trim()); } + @Override + void reset(ViewHolder viewHolder, long taskId) { + TextView view = extended ? viewHolder.extendedDetails : viewHolder.details; + view.setVisibility(View.GONE); + } } /** @@ -432,11 +441,7 @@ public class TaskAdapter extends CursorAdapter { if(decorations == null || viewHolder.task.getId() != taskId) return; - if(viewHolder.decorations != null) { - for(View view : viewHolder.decorations) - viewHolder.taskRow.removeView(view); - } - viewHolder.view.setBackgroundColor(Color.TRANSPARENT); + reset(viewHolder, taskId); if(decorations.size() == 0) return; @@ -462,6 +467,15 @@ public class TaskAdapter extends CursorAdapter { i++; } } + + @Override + void reset(ViewHolder viewHolder, long taskId) { + if(viewHolder.decorations != null) { + for(View view : viewHolder.decorations) + viewHolder.taskRow.removeView(view); + } + viewHolder.view.setBackgroundColor(Color.TRANSPARENT); + } } /** @@ -483,12 +497,7 @@ public class TaskAdapter extends CursorAdapter { if(actions == null || viewHolder.task.getId() != taskId) return; - if(expanded != taskId) { - viewHolder.actions.setVisibility(View.GONE); - return; - } - viewHolder.actions.setVisibility(View.VISIBLE); - viewHolder.actions.removeAllViews(); + reset(viewHolder, taskId); LinearLayout.LayoutParams params = new LinearLayout.LayoutParams(LayoutParams.FILL_PARENT, @@ -516,6 +525,16 @@ public class TaskAdapter extends CursorAdapter { } } + + @Override + void reset(ViewHolder viewHolder, long taskId) { + if(expanded != taskId) { + viewHolder.actions.setVisibility(View.GONE); + return; + } + viewHolder.actions.setVisibility(View.VISIBLE); + viewHolder.actions.removeAllViews(); + } } /* ====================================================================== @@ -675,6 +694,9 @@ public class TaskAdapter extends CursorAdapter { /** updates the given view */ abstract void draw(ViewHolder viewHolder, long taskId, Collection list); + /** resets the view as if there was nothing */ + abstract void reset(ViewHolder viewHolder, long taskId); + /** on receive an intent */ public void addNew(long taskId, String addOn, TYPE item) { if(item == null)