diff --git a/astrid/plugin-src/com/todoroo/astrid/gcal/Calendars.java b/astrid/plugin-src/com/todoroo/astrid/gcal/Calendars.java
index e68e141f1..0defec359 100644
--- a/astrid/plugin-src/com/todoroo/astrid/gcal/Calendars.java
+++ b/astrid/plugin-src/com/todoroo/astrid/gcal/Calendars.java
@@ -83,30 +83,29 @@ public class Calendars {
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);
- // 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();
- 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;
+ }
- 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();
- int calendarCount = c.getCount();
+ result.calendars = new String[calendarCount];
+ result.calendarIds = new String[calendarCount];
- result.calendars = new String[calendarCount];
- result.calendarIds = new String[calendarCount];
-
- // Iterate calendars one by one, and fill up the list preference
- try {
+ // 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);
@@ -130,7 +129,8 @@ public class Calendars {
return result;
} finally {
- c.deactivate();
+ if(c != null)
+ c.close();
}
}
diff --git a/astrid/plugin-src/com/todoroo/astrid/timers/TimerActionExposer.java b/astrid/plugin-src/com/todoroo/astrid/timers/TimerActionExposer.java
index fed1e858e..521d58fb9 100644
--- a/astrid/plugin-src/com/todoroo/astrid/timers/TimerActionExposer.java
+++ b/astrid/plugin-src/com/todoroo/astrid/timers/TimerActionExposer.java
@@ -44,7 +44,7 @@ public class TimerActionExposer extends BroadcastReceiver {
Intent newIntent = new Intent(TIMER_ACTION);
newIntent.putExtra(AstridApiConstants.EXTRAS_TASK_ID, taskId);
TaskAction action = new TaskAction(label,
- PendingIntent.getBroadcast(context, 0, newIntent, 0));
+ PendingIntent.getBroadcast(context, (int)taskId, newIntent, 0));
// transmit
Intent broadcastIntent = new Intent(AstridApiConstants.BROADCAST_SEND_ACTIONS);
diff --git a/astrid/plugin-src/com/todoroo/astrid/timers/TimerPlugin.java b/astrid/plugin-src/com/todoroo/astrid/timers/TimerPlugin.java
index a2fbe632b..461c38216 100644
--- a/astrid/plugin-src/com/todoroo/astrid/timers/TimerPlugin.java
+++ b/astrid/plugin-src/com/todoroo/astrid/timers/TimerPlugin.java
@@ -77,7 +77,7 @@ public class TimerPlugin extends BroadcastReceiver {
Intent notifyIntent = ShortcutActivity.createIntent(filter);
notifyIntent.setFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP);
PendingIntent pendingIntent = PendingIntent.getActivity(context,
- 0, notifyIntent, 0);
+ Constants.NOTIFICATION_TIMER, notifyIntent, 0);
Resources r = context.getResources();
String appName = r.getString(R.string.app_name);
diff --git a/astrid/res/layout/timer_decoration.xml b/astrid/res/layout/timer_decoration.xml
index c618f2da6..1f568e9c0 100644
--- a/astrid/res/layout/timer_decoration.xml
+++ b/astrid/res/layout/timer_decoration.xml
@@ -2,20 +2,23 @@
diff --git a/astrid/src/com/todoroo/astrid/adapter/TaskAdapter.java b/astrid/src/com/todoroo/astrid/adapter/TaskAdapter.java
index 5c803eb96..05e782e75 100644
--- a/astrid/src/com/todoroo/astrid/adapter/TaskAdapter.java
+++ b/astrid/src/com/todoroo/astrid/adapter/TaskAdapter.java
@@ -1,7 +1,6 @@
package com.todoroo.astrid.adapter;
import java.util.Collection;
-import java.util.Collections;
import java.util.Date;
import java.util.HashMap;
import java.util.Iterator;
@@ -15,7 +14,6 @@ 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;
@@ -109,6 +107,9 @@ public class TaskAdapter extends CursorAdapter {
protected OnCompletedTaskListener onCompletedTaskListener = null;
private int fontSize;
+ // the task that's expanded
+ private long expanded = -1;
+
// --- task detail and decoration soft caches
public final DetailManager detailManager = new DetailManager(false);
@@ -161,6 +162,7 @@ public class TaskAdapter extends CursorAdapter {
// create view holder
ViewHolder viewHolder = new ViewHolder();
viewHolder.task = new Task();
+ viewHolder.view = view;
viewHolder.nameView = (TextView)view.findViewById(R.id.title);
viewHolder.completeBox = (CheckBox)view.findViewById(R.id.completeBox);
viewHolder.dueDate = (TextView)view.findViewById(R.id.dueDate);
@@ -189,11 +191,12 @@ public class TaskAdapter extends CursorAdapter {
public void bindView(View view, Context context, Cursor c) {
TodorooCursor cursor = (TodorooCursor)c;
ViewHolder viewHolder = ((ViewHolder)view.getTag());
- Task actionItem = viewHolder.task;
- actionItem.readFromCursor(cursor);
+
+ Task task = viewHolder.task;
+ task.readFromCursor(cursor);
setFieldContentsAndVisibility(view);
- setTaskAppearance(viewHolder, actionItem.isCompleted());
+ setTaskAppearance(viewHolder, task.isCompleted());
}
/** Helper method to set the visibility based on if there's stuff inside */
@@ -212,6 +215,7 @@ public class TaskAdapter extends CursorAdapter {
*/
public class ViewHolder {
public Task task;
+ public View view;
public TextView nameView;
public CheckBox completeBox;
public TextView dueDate;
@@ -220,7 +224,6 @@ public class TaskAdapter extends CursorAdapter {
public View importance;
public LinearLayout actions;
public LinearLayout taskRow;
- public boolean expanded;
public View[] decorations;
}
@@ -286,10 +289,17 @@ public class TaskAdapter extends CursorAdapter {
importanceView.setBackgroundColor(IMPORTANCE_COLORS[value]);
}
- // details and decorations
+ // details and decorations, expanded
if(!isFling) {
detailManager.request(viewHolder);
decorationManager.request(viewHolder);
+ if(expanded == task.getId()) {
+ extendedDetailManager.request(viewHolder);
+ taskActionManager.request(viewHolder);
+ } else {
+ viewHolder.extendedDetails.setVisibility(View.GONE);
+ viewHolder.actions.setVisibility(View.GONE);
+ }
}
}
@@ -365,7 +375,7 @@ public class TaskAdapter extends CursorAdapter {
continue;
activity.runOnUiThread(new Runnable() {
public void run() {
- draw(viewHolder, cacheList);
+ draw(viewHolder, taskId, cacheList);
}
});
}
@@ -379,17 +389,15 @@ public class TaskAdapter extends CursorAdapter {
@SuppressWarnings("nls")
@Override
- void draw(ViewHolder viewHolder, Collection details) {
- if(details == null)
+ void draw(ViewHolder viewHolder, long taskId, Collection details) {
+ if(details == null || viewHolder.task.getId() != taskId)
return;
TextView view = extended ? viewHolder.extendedDetails : viewHolder.details;
- view.setVisibility(!details.isEmpty() ? View.VISIBLE : View.GONE);
- if(details.isEmpty() || (extended && !viewHolder.expanded)) {
+ if(details.isEmpty() || (extended && expanded != taskId)) {
view.setVisibility(View.GONE);
return;
- } else {
- view.setVisibility(View.VISIBLE);
}
+ view.setVisibility(View.VISIBLE);
StringBuilder detailText = new StringBuilder();
for(Iterator iterator = details.iterator(); iterator.hasNext(); ) {
detailText.append(iterator.next());
@@ -420,16 +428,17 @@ public class TaskAdapter extends CursorAdapter {
}
@Override
- void draw(ViewHolder viewHolder, Collection decorations) {
- if(decorations == null || decorations.size() == 0)
+ void draw(ViewHolder viewHolder, long taskId, Collection decorations) {
+ if(decorations == null || viewHolder.task.getId() != taskId)
return;
if(viewHolder.decorations != null) {
for(View view : viewHolder.decorations)
viewHolder.taskRow.removeView(view);
- ((View)viewHolder.taskRow.getParent()).setBackgroundColor(Color.TRANSPARENT);
}
-
+ viewHolder.view.setBackgroundColor(Color.TRANSPARENT);
+ if(decorations.size() == 0)
+ return;
int i = 0;
boolean colorSet = false;
@@ -437,7 +446,7 @@ public class TaskAdapter extends CursorAdapter {
for(TaskDecoration decoration : decorations) {
if(decoration.color != 0 && !colorSet) {
colorSet = true;
- ((View)viewHolder.taskRow.getParent()).setBackgroundColor(decoration.color);
+ viewHolder.view.setBackgroundColor(decoration.color);
}
if(decoration.decoration != null) {
View view = decoration.decoration.apply(activity, viewHolder.taskRow);
@@ -470,11 +479,11 @@ public class TaskAdapter extends CursorAdapter {
}
@Override
- void draw(final ViewHolder viewHolder, Collection actions) {
- if(actions == null)
+ void draw(final ViewHolder viewHolder, final long taskId, Collection actions) {
+ if(actions == null || viewHolder.task.getId() != taskId)
return;
- if(!viewHolder.expanded) {
+ if(expanded != taskId) {
viewHolder.actions.setVisibility(View.GONE);
return;
}
@@ -491,7 +500,6 @@ public class TaskAdapter extends CursorAdapter {
@Override
public void onClick(View arg0) {
Intent intent = new Intent(activity, TaskEditActivity.class);
- long taskId = viewHolder.task.getId();
intent.putExtra(TaskEditActivity.ID_TOKEN, taskId);
activity.startActivity(intent);
}
@@ -542,13 +550,9 @@ 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$
+ exceptionService.displayAndReportError(activity,
+ "Error launching action", e); //$NON-NLS-1$
}
}
};
@@ -565,15 +569,13 @@ public class TaskAdapter extends CursorAdapter {
public void onClick(View v) {
// expand view
final ViewHolder viewHolder = (ViewHolder)v.getTag();
- viewHolder.expanded = !viewHolder.expanded;
-
- if(viewHolder.expanded) {
- extendedDetailManager.request(viewHolder);
- taskActionManager.request(viewHolder);
+ long taskId = viewHolder.task.getId();
+ if(expanded == taskId) {
+ expanded = -1;
} else {
- viewHolder.extendedDetails.setVisibility(View.GONE);
- viewHolder.actions.setVisibility(View.GONE);
+ expanded = taskId;
}
+ notifyDataSetInvalidated();
}
}
@@ -640,8 +642,7 @@ public class TaskAdapter extends CursorAdapter {
abstract private class AddOnManager {
private final Map> cache =
- Collections.synchronizedMap(new SoftHashMap>());
+ new SoftHashMap>();
// --- interface
@@ -654,14 +655,14 @@ public class TaskAdapter extends CursorAdapter {
Collection list = initialize(taskId);
if(list != null) {
- draw(viewHolder, list);
+ draw(viewHolder, taskId, list);
return false;
}
// request details
+ draw(viewHolder, taskId, get(taskId));
Intent broadcastIntent = createBroadcastIntent(taskId);
activity.sendOrderedBroadcast(broadcastIntent, AstridApiConstants.PERMISSION_READ);
- draw(viewHolder, get(taskId));
return true;
}
@@ -669,7 +670,7 @@ public class TaskAdapter extends CursorAdapter {
abstract Intent createBroadcastIntent(long taskId);
/** updates the given view */
- abstract void draw(ViewHolder viewHolder, Collection list);
+ abstract void draw(ViewHolder viewHolder, long taskId, Collection list);
/** on receive an intent */
public void addNew(long taskId, String addOn, TYPE item) {
@@ -685,7 +686,7 @@ public class TaskAdapter extends CursorAdapter {
ViewHolder viewHolder = (ViewHolder) listView.getChildAt(i).getTag();
if(viewHolder == null || viewHolder.task.getId() != taskId)
continue;
- draw(viewHolder, cacheList);
+ draw(viewHolder, taskId, cacheList);
break;
}
}
@@ -706,7 +707,7 @@ public class TaskAdapter extends CursorAdapter {
* @param taskId
* @return list if there was already one
*/
- protected Collection initialize(long taskId) {
+ protected synchronized Collection initialize(long taskId) {
if(cache.containsKey(taskId))
return get(taskId);
cache.put(taskId, new HashMap());
@@ -719,7 +720,7 @@ public class TaskAdapter extends CursorAdapter {
* @param item
* @return iterator if item was added, null if it already existed
*/
- protected Collection addIfNotExists(long taskId, String addOn,
+ protected synchronized Collection addIfNotExists(long taskId, String addOn,
TYPE item) {
HashMap list = cache.get(taskId);
if(list == null)