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; String fromUpdateClass = (tagData == null) ? UpdateAdapter.FROM_RECENT_ACTIVITY_VIEW : UpdateAdapter.FROM_TAG_VIEW;
updateAdapter = new UpdateAdapter(this, R.layout.update_adapter_row, 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)); ListView listView = ((ListView) getView().findViewById(android.R.id.list));
addHeaderToListView(listView); addHeaderToListView(listView);
listView.setAdapter(updateAdapter); 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) { private boolean ancestorOf(Node ancestor, Node descendant) {

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

@ -68,7 +68,7 @@
<item name="asFilterHeaderColor">#ffffff</item> <item name="asFilterHeaderColor">#ffffff</item>
<item name="asFilterHeaderBackground">@drawable/edit_titlebar_white</item> <item name="asFilterHeaderBackground">@drawable/edit_titlebar_white</item>
<item name="asMembersHeaderBackground">#d0d0d0</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="asAddButtonImg">@drawable/plus_button_red</item>
<item name="asMicButtonImg">@drawable/mic_button_red</item> <item name="asMicButtonImg">@drawable/mic_button_red</item>
<item name="asCommentButtonImg">@drawable/comment_red</item> <item name="asCommentButtonImg">@drawable/comment_red</item>

@ -1082,12 +1082,12 @@ public class TaskAdapter extends CursorAdapter implements Filterable {
return; return;
if (newState != task.isCompleted()) { if (newState != task.isCompleted()) {
completedItems.put(task.getId(), newState);
taskService.setComplete(task, newState);
if(onCompletedTaskListener != null) if(onCompletedTaskListener != null)
onCompletedTaskListener.onCompletedTask(task, newState); onCompletedTaskListener.onCompletedTask(task, newState);
completedItems.put(task.getId(), newState);
taskService.setComplete(task, newState);
if(newState) if(newState)
StatisticsService.reportEvent(StatisticsConstants.TASK_COMPLETED_V2); 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.service.DependencyInjectionService;
import com.todoroo.andlib.utility.DateUtilities; import com.todoroo.andlib.utility.DateUtilities;
import com.todoroo.astrid.actfm.sync.ActFmPreferenceService; import com.todoroo.astrid.actfm.sync.ActFmPreferenceService;
import com.todoroo.astrid.adapter.TaskAdapter.OnCompletedTaskListener;
import com.todoroo.astrid.data.Update; import com.todoroo.astrid.data.Update;
import com.todoroo.astrid.helper.ImageDiskCache; 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> * @author Tim Su <tim@todoroo.com>
* *
@ -82,7 +81,7 @@ public class UpdateAdapter extends CursorAdapter {
*/ */
public UpdateAdapter(Fragment fragment, int resource, public UpdateAdapter(Fragment fragment, int resource,
Cursor c, boolean autoRequery, Cursor c, boolean autoRequery,
OnCompletedTaskListener onCompletedTaskListener, String fromView) { String fromView) {
super(fragment.getActivity(), c, autoRequery); super(fragment.getActivity(), c, autoRequery);
DependencyInjectionService.getInstance().inject(this); DependencyInjectionService.getInstance().inject(this);

Loading…
Cancel
Save