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)