Add a sort setting for toggling subtasks. On change, it recreates the task list. Also a fix for the child tasks not getting completed with subtasks correctly

pull/14/head
Tim Su 13 years ago
parent d586f0d3e4
commit d9765ee8b6

@ -71,6 +71,13 @@ public class SortHelper {
return (flags & FLAG_DRAG_DROP) > 0;
}
public static int setManualSort(int flags, boolean status) {
flags = (flags & ~FLAG_DRAG_DROP);
if(status)
flags |= FLAG_DRAG_DROP;
return flags;
}
@SuppressWarnings("nls")
public static Order orderForSortType(int sortType) {
Order order;

@ -46,9 +46,7 @@ public final class CoreFilterExposer extends BroadcastReceiver implements Astrid
private FilterListItem[] prepareFilters(Resources r) {
// core filters
Filter inbox = new Filter(r.getString(R.string.BFE_Active), r.getString(R.string.BFE_Active),
(String) null, null);
inbox.listingIcon = ((BitmapDrawable)r.getDrawable(R.drawable.filter_inbox)).getBitmap();
Filter inbox = buildInboxFilter(r);
// transmit filter list
FilterListItem[] list = new FilterListItem[1];

@ -239,7 +239,7 @@ public class GtasksListFragment extends DraggableTaskListFragment {
}
getActivity().runOnUiThread(new Runnable() {
public void run() {
loadTaskListContent(true);
taskAdapter.notifyDataSetInvalidated();
}
});
}

@ -4,6 +4,7 @@ import java.util.ArrayList;
import java.util.Arrays;
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.database.Cursor;
@ -72,6 +73,7 @@ public class SubtasksListFragment extends TaskListFragment {
public Property<?>[] taskProperties() {
ArrayList<Property<?>> properties = new ArrayList<Property<?>>(Arrays.asList(TaskAdapter.PROPERTIES));
properties.add(SubtasksMetadata.INDENT);
properties.add(SubtasksMetadata.ORDER);
return properties.toArray(new Property<?>[properties.size()]);
}
@ -171,19 +173,27 @@ public class SubtasksListFragment extends TaskListFragment {
public TaskRowListener getListener() {
return listener;
}
}
@Override
protected boolean isDraggable() {
return true;
}
private void setCompletedForItemAndSubtasks(Task item, boolean completedState) {
private void setCompletedForItemAndSubtasks(final Task item, boolean completedState) {
final long itemId = item.getId();
final boolean completed = completedState;
System.err.println("SET COMPLETED FOR " + itemId);
new Thread() {
@Override
public void run() {
final AtomicInteger startIndent = new AtomicInteger(-1);
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 Task task = new Task();
task.setValue(Task.COMPLETION_DATE, completed ? DateUtilities.now() : 0);
@ -193,23 +203,26 @@ public class SubtasksListFragment extends TaskListFragment {
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(taskId == itemId) {
startIndent.set(indent);
if(order < startOrder.get())
return;
} else if(indent == startIndent.get()) {
else if(indent == startIndent.get()) {
finished.set(true);
return;
}
taskAdapter.getCompletedItems().put(taskId, true);
task.setId(taskId);
taskService.save(task);
}
});
getActivity().runOnUiThread(new Runnable() {
public void run() {
loadTaskListContent(true);
taskAdapter.notifyDataSetInvalidated();
}
});
}

@ -121,8 +121,8 @@ public class SubtasksUpdater extends OrderedListUpdater<String> {
order = previousOrder.get() + 1;
int indent = metadata.getValue(SubtasksMetadata.INDENT);
if(indent > previousIndent.get() + 1) // bad
indent = previousIndent.get();
if(indent < 0 || indent > previousIndent.get() + 1) // bad
indent = Math.max(0, previousIndent.get());
metadata.setValue(SubtasksMetadata.ORDER, order);
metadata.setValue(SubtasksMetadata.INDENT, indent);

@ -23,6 +23,7 @@ import com.todoroo.astrid.api.Filter;
import com.todoroo.astrid.api.FilterListItem;
import com.todoroo.astrid.api.FilterWithCustomIntent;
import com.todoroo.astrid.api.IntentFilter;
import com.todoroo.astrid.core.CoreFilterExposer;
import com.todoroo.astrid.core.PluginServices;
import com.todoroo.astrid.core.SearchFilter;
import com.todoroo.astrid.core.SortHelper;
@ -204,9 +205,13 @@ public class AstridActivity extends FragmentActivity
protected final void setupTasklistFragmentWithFilter(Filter filter) {
Class<?> customTaskList = TaskListFragment.class;
if(filter == null || filter.sqlQuery == null) {
System.err.println("default time"); //$NON-NLS-1$
if(filter == null || filter.sqlQuery ==
CoreFilterExposer.buildInboxFilter(getResources()).sqlQuery) {
System.err.println("is inbox"); //$NON-NLS-1$
SharedPreferences publicPrefs = AstridPreferences.getPublicPrefs(this);
int sortFlags = publicPrefs.getInt(SortHelper.PREF_SORT_FLAGS, 0);
System.err.println("is manual sort? " + SortHelper.isManualSort(sortFlags)); //$NON-NLS-1$
if(SortHelper.isManualSort(sortFlags))
customTaskList = SubtasksListFragment.class;
}
@ -215,6 +220,7 @@ public class AstridActivity extends FragmentActivity
}
protected final void setupTasklistFragmentWithFilterAndCustomTaskList(Filter filter, Class<?> customTaskList) {
System.err.println("HAJIMEMASHITE setting up fragment with class " + customTaskList); //$NON-NLS-1$
Class<?> component = customTaskList;
if (filter instanceof FilterWithCustomIntent) {
try {
@ -227,6 +233,7 @@ public class AstridActivity extends FragmentActivity
FragmentTransaction transaction = manager.beginTransaction();
try {
System.err.println("setting up fragment with class " + customTaskList); //$NON-NLS-1$
TaskListFragment newFragment = (TaskListFragment) component.newInstance();
transaction.replace(R.id.tasklist_fragment_container, newFragment,
TaskListFragment.TAG_TASKLIST_FRAGMENT);

@ -28,7 +28,7 @@ public class SortSelectionActivity {
* @param activity
* @return
*/
public static AlertDialog createDialog(Activity activity,
public static AlertDialog createDialog(Activity activity, boolean showDragDrop,
OnSortSelectedListener listener, int flags, int sort) {
View body = activity.getLayoutInflater().inflate(R.layout.sort_selection_dialog, null);
@ -41,7 +41,10 @@ public class SortSelectionActivity {
if((flags & SortHelper.FLAG_SHOW_DELETED) > 0)
((CheckBox)body.findViewById(R.id.deleted)).setChecked(true);
if((flags & SortHelper.FLAG_DRAG_DROP) > 0)
if(!showDragDrop)
body.findViewById(R.id.sort_drag).setVisibility(View.GONE);
if(showDragDrop && (flags & SortHelper.FLAG_DRAG_DROP) > 0)
((RadioButton)body.findViewById(R.id.sort_drag)).setChecked(true);
else {
switch(sort) {

@ -86,6 +86,7 @@ import com.todoroo.astrid.service.StatisticsService;
import com.todoroo.astrid.service.TagDataService;
import com.todoroo.astrid.service.TaskService;
import com.todoroo.astrid.service.UpgradeService;
import com.todoroo.astrid.subtasks.SubtasksListFragment;
import com.todoroo.astrid.ui.QuickAddBar;
import com.todoroo.astrid.utility.AstridPreferences;
import com.todoroo.astrid.utility.Constants;
@ -352,14 +353,12 @@ public class TaskListFragment extends ListFragment implements OnScrollListener,
return;
} else if (extras != null && extras.containsKey(TOKEN_FILTER)) {
filter = extras.getParcelable(TOKEN_FILTER);
if(filter.sqlQuery == null)
filter = null;
else
isInbox = false;
isInbox = false;
}
if(filter == null) {
filter = CoreFilterExposer.buildInboxFilter(getResources());
Filter inbox = CoreFilterExposer.buildInboxFilter(getResources());
if(filter == null || filter.sqlQuery == inbox.sqlQuery) {
filter = inbox;
isInbox = true;
}
@ -501,9 +500,11 @@ public class TaskListFragment extends ListFragment implements OnScrollListener,
}
});
System.err.println("NOW setup ui componetns");
SharedPreferences publicPrefs = AstridPreferences.getPublicPrefs(getActivity());
sortFlags = publicPrefs.getInt(SortHelper.PREF_SORT_FLAGS, 0);
sortSort = publicPrefs.getInt(SortHelper.PREF_SORT_SORT, 0);
sortFlags = SortHelper.setManualSort(sortFlags, isDraggable());
getView().findViewById(R.id.progressBar).setVisibility(View.GONE);
}
@ -1064,9 +1065,10 @@ public class TaskListFragment extends ListFragment implements OnScrollListener,
showSettings();
return true;
case MENU_SORT_ID:
System.err.println("displaying " + sortFlags);
StatisticsService.reportEvent(StatisticsConstants.TLA_MENU_SORT);
AlertDialog dialog = SortSelectionActivity.createDialog(
getActivity(), this, sortFlags, sortSort);
getActivity(), isInbox, this, sortFlags, sortSort);
dialog.show();
return true;
case MENU_SYNC_ID:
@ -1166,11 +1168,29 @@ public class TaskListFragment extends ListFragment implements OnScrollListener,
mListener.onTaskListItemClicked(taskId);
}
protected void toggleDragDrop(boolean newState) {
if(newState)
((AstridActivity)getActivity()).setupTasklistFragmentWithFilterAndCustomTaskList(filter,
SubtasksListFragment.class);
else
((AstridActivity)getActivity()).setupTasklistFragmentWithFilterAndCustomTaskList(filter,
TaskListFragment.class);
}
protected boolean isDraggable() {
return false;
}
@Override
public void onSortSelected(boolean always, int flags, int sort) {
boolean manualSettingChanged = SortHelper.isManualSort(sortFlags) !=
SortHelper.isManualSort(flags);
sortFlags = flags;
sortSort = sort;
System.err.println("FLAGS : " + flags);
if (always) {
SharedPreferences publicPrefs = AstridPreferences.getPublicPrefs(getActivity());
Editor editor = publicPrefs.edit();
@ -1182,7 +1202,9 @@ public class TaskListFragment extends ListFragment implements OnScrollListener,
TasksWidget.WidgetUpdateService.class));
}
Filter newFilter = isInbox ? null : filter;
((AstridActivity)getActivity()).onFilterItemClicked(newFilter);
if(manualSettingChanged)
toggleDragDrop(SortHelper.isManualSort(sortFlags));
else
loadTaskListContent(true);
}
}

@ -852,6 +852,10 @@ public class TaskAdapter extends CursorAdapter implements Filterable {
taskActionLoader.remove(taskId);
}
public HashMap<Long, Boolean> getCompletedItems() {
return completedItems;
}
/**
* AddOnManager for TaskDecorations
*

Loading…
Cancel
Save