Fix for chained completion not working when tasks didn't have an order. Now onTaskComplete fires before actual thing is saved into the database.

pull/14/head
Tim Su 14 years ago
parent 984958adcd
commit b9f30c7d61

@ -199,7 +199,7 @@ public class TagUpdatesFragment extends ListFragment {
String fromUpdateClass = (tagData == null) ? UpdateAdapter.FROM_RECENT_ACTIVITY_VIEW : UpdateAdapter.FROM_TAG_VIEW;
updateAdapter = new UpdateAdapter(this, R.layout.update_adapter_row,
currentCursor, false, null, fromUpdateClass);
currentCursor, false, fromUpdateClass);
ListView listView = ((ListView) getView().findViewById(android.R.id.list));
addHeaderToListView(listView);
listView.setAdapter(updateAdapter);

@ -180,7 +180,7 @@ abstract public class OrderedListUpdater<LIST> {
}
}
traverseTreeAndWriteValues(list, root, new AtomicLong(0), -1);
traverseTreeAndWriteValues(list, root, new AtomicLong(1), -1);
}
private boolean ancestorOf(Node ancestor, Node descendant) {

@ -6,8 +6,6 @@ import java.util.Collections;
import java.util.HashMap;
import java.util.Map;
import java.util.concurrent.atomic.AtomicBoolean;
import java.util.concurrent.atomic.AtomicInteger;
import java.util.concurrent.atomic.AtomicLong;
import java.util.concurrent.atomic.AtomicReference;
import android.app.Activity;
@ -217,10 +215,10 @@ public class SubtasksFragmentHelper {
}
}
private final Map<Long, ArrayList<Long>> chainedCompletions =
Collections.synchronizedMap(new HashMap<Long, ArrayList<Long>>());
private void setCompletedForItemAndSubtasks(final Task item, final boolean completedState) {
final Map<Long, ArrayList<Long>> chainedCompletions =
Collections.synchronizedMap(new HashMap<Long, ArrayList<Long>>());
final long itemId = item.getId();
@ -240,48 +238,38 @@ public class SubtasksFragmentHelper {
return;
}
new Thread() {
final int startIndent = item.getValue(SubtasksMetadata.INDENT);
final AtomicBoolean started = new AtomicBoolean(false);
final AtomicBoolean finished = new AtomicBoolean(false);
final ArrayList<Long> chained = new ArrayList<Long>();
chainedCompletions.put(itemId, chained);
updater.iterateThroughList(getFilter(), list, new OrderedListIterator() {
@Override
public void run() {
final AtomicInteger startIndent = new AtomicInteger(
item.getValue(SubtasksMetadata.INDENT));
final AtomicLong startOrder= new AtomicLong(
item.getValue(SubtasksMetadata.ORDER));
final AtomicBoolean finished = new AtomicBoolean(false);
final ArrayList<Long> chained = new ArrayList<Long>();
chainedCompletions.put(itemId, chained);
updater.iterateThroughList(getFilter(), list, new OrderedListIterator() {
@Override
public void processTask(long taskId, Metadata metadata) {
if(finished.get())
return;
long order = metadata.containsNonNullValue(SubtasksMetadata.ORDER) ?
metadata.getValue(SubtasksMetadata.ORDER) : 0;
int indent = metadata.containsNonNullValue(SubtasksMetadata.INDENT) ?
metadata.getValue(SubtasksMetadata.INDENT) : 0;
if(order < startOrder.get())
return;
else if(indent == startIndent.get()) {
finished.set(true);
return;
}
taskAdapter.getCompletedItems().put(taskId, true);
task.setId(taskId);
taskService.save(task);
chained.add(taskId);
}
});
getActivity().runOnUiThread(new Runnable() {
public void run() {
taskAdapter.notifyDataSetInvalidated();
}
});
public void processTask(long taskId, Metadata metadata) {
if(finished.get())
return;
int indent = metadata.containsNonNullValue(SubtasksMetadata.INDENT) ?
metadata.getValue(SubtasksMetadata.INDENT) : 0;
if(taskId == itemId){
started.set(true);
return;
} else if(!started.get())
return;
else if(indent <= startIndent) {
finished.set(true);
return;
}
taskAdapter.getCompletedItems().put(taskId, true);
task.setId(taskId);
taskService.save(task);
chained.add(taskId);
}
}.start();
});
taskAdapter.notifyDataSetInvalidated();
}
public void setList(String list) {

@ -68,7 +68,7 @@
<item name="asFilterHeaderColor">#ffffff</item>
<item name="asFilterHeaderBackground">@drawable/edit_titlebar_white</item>
<item name="asMembersHeaderBackground">#d0d0d0</item>
<item name="asListDividerColor">#bbbbbb</item>
<item name="asListDividerColor">#cccccc</item>
<item name="asAddButtonImg">@drawable/plus_button_red</item>
<item name="asMicButtonImg">@drawable/mic_button_red</item>
<item name="asCommentButtonImg">@drawable/comment_red</item>

@ -1082,12 +1082,12 @@ public class TaskAdapter extends CursorAdapter implements Filterable {
return;
if (newState != task.isCompleted()) {
completedItems.put(task.getId(), newState);
taskService.setComplete(task, newState);
if(onCompletedTaskListener != null)
onCompletedTaskListener.onCompletedTask(task, newState);
completedItems.put(task.getId(), newState);
taskService.setComplete(task, newState);
if(newState)
StatisticsService.reportEvent(StatisticsConstants.TASK_COMPLETED_V2);
}

@ -32,12 +32,11 @@ import com.todoroo.andlib.service.ContextManager;
import com.todoroo.andlib.service.DependencyInjectionService;
import com.todoroo.andlib.utility.DateUtilities;
import com.todoroo.astrid.actfm.sync.ActFmPreferenceService;
import com.todoroo.astrid.adapter.TaskAdapter.OnCompletedTaskListener;
import com.todoroo.astrid.data.Update;
import com.todoroo.astrid.helper.ImageDiskCache;
/**
* Adapter for displaying a user's goals as a list
* Adapter for displaying a user's activity
*
* @author Tim Su <tim@todoroo.com>
*
@ -82,7 +81,7 @@ public class UpdateAdapter extends CursorAdapter {
*/
public UpdateAdapter(Fragment fragment, int resource,
Cursor c, boolean autoRequery,
OnCompletedTaskListener onCompletedTaskListener, String fromView) {
String fromView) {
super(fragment.getActivity(), c, autoRequery);
DependencyInjectionService.getInstance().inject(this);

Loading…
Cancel
Save