Improved the way that task details work (to use a string builder), nice background for selected tasks, make purge really work)

pull/14/head
Tim Su 16 years ago
parent 4253cec645
commit 13a4d51ca2

@ -847,9 +847,7 @@ public class TaskListActivity extends ListActivity implements OnScrollListener,
case CONTEXT_MENU_PURGE_TASK_ID: { case CONTEXT_MENU_PURGE_TASK_ID: {
itemId = item.getGroupId(); itemId = item.getGroupId();
Task task = new Task(); taskService.purge(itemId);
task.setId(itemId);
taskService.delete(task);
loadTaskListContent(true); loadTaskListContent(true);
return true; return true;
} }

@ -13,6 +13,7 @@ import android.content.Context;
import android.content.Intent; import android.content.Intent;
import android.content.res.Resources; import android.content.res.Resources;
import android.database.Cursor; import android.database.Cursor;
import android.graphics.Color;
import android.graphics.Paint; import android.graphics.Paint;
import android.graphics.drawable.Drawable; import android.graphics.drawable.Drawable;
import android.text.Html; import android.text.Html;
@ -319,8 +320,8 @@ public class TaskAdapter extends CursorAdapter implements Filterable {
} }
String details; String details;
if(tasksToLoad.containsKey(task.getId())) if(taskDetailLoader.containsKey(task.getId()))
details = tasksToLoad.get(task.getId()).getValue(Task.DETAILS); details = taskDetailLoader.get(task.getId()).toString();
else else
details = task.getValue(Task.DETAILS); details = task.getValue(Task.DETAILS);
if(TextUtils.isEmpty(details)) { if(TextUtils.isEmpty(details)) {
@ -374,19 +375,26 @@ public class TaskAdapter extends CursorAdapter implements Filterable {
* ============================================================== details * ============================================================== details
* ====================================================================== */ * ====================================================================== */
private final Map<Long, Task> tasksToLoad = Collections.synchronizedMap(new HashMap<Long, Task>()); // implementation note: this map is really costly if users have
// a large number of tasks to load, since it all goes into memory.
// it's best to do this, though, in order to append details to each other
private final Map<Long, StringBuilder> taskDetailLoader = Collections.synchronizedMap(new HashMap<Long, StringBuilder>());
private final Task taskDetailContainer = new Task();
public class DetailLoaderThread extends Thread { public class DetailLoaderThread extends Thread {
@Override @Override
public void run() { public void run() {
// for all of the tasks returned by our cursor, verify details // for all of the tasks returned by our cursor, verify details
TodorooCursor<Task> fetchCursor = taskService.fetchFiltered( TodorooCursor<Task> fetchCursor = taskService.fetchFiltered(
query.get(), null, Task.ID, Task.DETAILS); query.get(), null, Task.ID, Task.DETAILS, Task.COMPLETION_DATE);
activity.startManagingCursor(fetchCursor); activity.startManagingCursor(fetchCursor);
Task task = new Task(); Task task = new Task();
for(fetchCursor.moveToFirst(); !fetchCursor.isAfterLast(); fetchCursor.moveToNext()) { for(fetchCursor.moveToFirst(); !fetchCursor.isAfterLast(); fetchCursor.moveToNext()) {
task.clear(); task.clear();
task.readFromCursor(fetchCursor); task.readFromCursor(fetchCursor);
if(task.isCompleted())
continue;
if(!task.containsNonNullValue(Task.DETAILS)) { if(!task.containsNonNullValue(Task.DETAILS)) {
System.err.println("READING details for " + task.getId()); System.err.println("READING details for " + task.getId());
@ -395,8 +403,7 @@ public class TaskAdapter extends CursorAdapter implements Filterable {
broadcastIntent.putExtra(AstridApiConstants.EXTRAS_EXTENDED, false); broadcastIntent.putExtra(AstridApiConstants.EXTRAS_EXTENDED, false);
activity.sendOrderedBroadcast(broadcastIntent, AstridApiConstants.PERMISSION_READ); activity.sendOrderedBroadcast(broadcastIntent, AstridApiConstants.PERMISSION_READ);
Task loadHolder = new Task(fetchCursor); taskDetailLoader.put(task.getId(), new StringBuilder());
tasksToLoad.put(task.getId(), loadHolder);
task.setValue(Task.DETAILS, ""); //$NON-NLS-1$ task.setValue(Task.DETAILS, ""); //$NON-NLS-1$
taskService.save(task); taskService.save(task);
@ -412,23 +419,27 @@ public class TaskAdapter extends CursorAdapter implements Filterable {
* @param detail * @param detail
*/ */
public void addDetails(long id, String detail) { public void addDetails(long id, String detail) {
final Task task = tasksToLoad.get(id); final StringBuilder details = taskDetailLoader.get(id);
if(task == null) if(details == null)
return; return;
String newDetails = task.getValue(Task.DETAILS); synchronized(details) {
if(TextUtils.isEmpty(newDetails)) if(details.toString().contains(detail))
newDetails = detail; return;
else if(newDetails.contains(detail)) if(details.length() > 0)
return; details.append(DETAIL_SEPARATOR);
else details.append(detail);
newDetails += DETAIL_SEPARATOR + detail; taskDetailContainer.setId(id);
task.setValue(Task.DETAILS, newDetails); taskDetailContainer.setValue(Task.DETAILS, details.toString());
taskService.save(task); taskService.save(taskDetailContainer);
}
activity.runOnUiThread(new Runnable() { activity.runOnUiThread(new Runnable() {
@Override @Override
public void run() { public void run() {
ListView listView = activity.getListView();
int scrollPos = listView.getScrollY();
notifyDataSetInvalidated(); notifyDataSetInvalidated();
listView.scrollTo(0, scrollPos);
} }
}); });
} }
@ -569,7 +580,10 @@ public class TaskAdapter extends CursorAdapter implements Filterable {
for(View view : viewHolder.decorations) for(View view : viewHolder.decorations)
viewHolder.taskRow.removeView(view); viewHolder.taskRow.removeView(view);
} }
viewHolder.view.setBackgroundResource(android.R.drawable.list_selector_background); if(taskId == expanded)
viewHolder.view.setBackgroundColor(Color.argb(20, 255, 255, 255));
else
viewHolder.view.setBackgroundResource(android.R.drawable.list_selector_background);
} }
} }

@ -132,6 +132,15 @@ public class TaskService {
} }
} }
/**
* Permanently delete the given task.
*
* @param model
*/
public void purge(long taskId) {
taskDao.delete(taskId);
}
/** /**
* Clean up tasks. Typically called on startup * Clean up tasks. Typically called on startup
*/ */

Loading…
Cancel
Save