diff --git a/api/src/com/todoroo/astrid/core/SortHelper.java b/api/src/com/todoroo/astrid/core/SortHelper.java index 2e3ee8b4d..e985375cc 100644 --- a/api/src/com/todoroo/astrid/core/SortHelper.java +++ b/api/src/com/todoroo/astrid/core/SortHelper.java @@ -19,6 +19,7 @@ public class SortHelper { public static final int FLAG_SHOW_COMPLETED = 1 << 1; public static final int FLAG_SHOW_HIDDEN = 1 << 2; public static final int FLAG_SHOW_DELETED = 1 << 3; + public static final int FLAG_DRAG_DROP = 1 << 4; public static final int SORT_AUTO = 0; public static final int SORT_ALPHA = 1; @@ -66,7 +67,11 @@ public class SortHelper { return originalSql; } + public static boolean isManualSort(int flags) { + return (flags & FLAG_DRAG_DROP) > 0; + } + @SuppressWarnings("nls") public static Order orderForSortType(int sortType) { Order order; switch(sortType) { diff --git a/astrid/plugin-src/com/todoroo/astrid/core/CoreFilterExposer.java b/astrid/plugin-src/com/todoroo/astrid/core/CoreFilterExposer.java index 08dc2fede..5e764667b 100644 --- a/astrid/plugin-src/com/todoroo/astrid/core/CoreFilterExposer.java +++ b/astrid/plugin-src/com/todoroo/astrid/core/CoreFilterExposer.java @@ -46,8 +46,9 @@ public final class CoreFilterExposer extends BroadcastReceiver implements Astrid private FilterListItem[] prepareFilters(Resources r) { // core filters - Filter inbox = buildInboxFilter(r); - + 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(); // transmit filter list FilterListItem[] list = new FilterListItem[1]; diff --git a/astrid/plugin-src/com/todoroo/astrid/subtasks/SubtasksUpdater.java b/astrid/plugin-src/com/todoroo/astrid/subtasks/SubtasksUpdater.java index 8cb850253..6605d1891 100644 --- a/astrid/plugin-src/com/todoroo/astrid/subtasks/SubtasksUpdater.java +++ b/astrid/plugin-src/com/todoroo/astrid/subtasks/SubtasksUpdater.java @@ -10,6 +10,7 @@ import com.todoroo.andlib.service.Autowired; import com.todoroo.andlib.sql.Criterion; import com.todoroo.andlib.sql.Query; import com.todoroo.astrid.api.Filter; +import com.todoroo.astrid.dao.TaskDao.TaskCriteria; import com.todoroo.astrid.data.Metadata; import com.todoroo.astrid.data.Task; import com.todoroo.astrid.service.MetadataService; @@ -95,8 +96,11 @@ public class SubtasksUpdater extends OrderedListUpdater { if(!query.contains(subtaskJoin)) { query = subtaskJoin + query; query = query.replaceAll("ORDER BY .*", ""); - query = query + String.format(" ORDER BY CAST(%s AS LONG) ASC, %s ASC", + query = query + String.format(" ORDER BY %s, %s, CAST(%s AS LONG), %s", + Task.DELETION_DATE, Task.COMPLETION_DATE, SubtasksMetadata.ORDER, Task.ID); + query = query.replace(TaskCriteria.isVisible().toString(), + Criterion.all.toString()); filter.sqlQuery = query; } diff --git a/astrid/res/layout/sort_selection_dialog.xml b/astrid/res/layout/sort_selection_dialog.xml index 60ec0dfc6..457c1595d 100644 --- a/astrid/res/layout/sort_selection_dialog.xml +++ b/astrid/res/layout/sort_selection_dialog.xml @@ -11,41 +11,19 @@ android:layout_width="fill_parent" android:layout_height="wrap_content" android:orientation="vertical"> - - - - - - - - - + - - + + + + + + + + + + + + diff --git a/astrid/res/values/strings-core.xml b/astrid/res/values/strings-core.xml index 820d7147e..856965c5a 100644 --- a/astrid/res/values/strings-core.xml +++ b/astrid/res/values/strings-core.xml @@ -102,7 +102,7 @@ Add-ons - Sort & Hidden + Sort & Subtasks Sync Now! @@ -214,7 +214,10 @@ - Sorting and Hidden Tasks + Sort, Subtasks, and Hidden + + + Hidden Tasks Show Completed Tasks @@ -225,8 +228,8 @@ Show Deleted Tasks - - Sort Options + + Drag & Drop with Subtasks Astrid Smart Sort diff --git a/astrid/src/com/todoroo/astrid/activity/AstridActivity.java b/astrid/src/com/todoroo/astrid/activity/AstridActivity.java index 0689a2545..3a2f7b28e 100644 --- a/astrid/src/com/todoroo/astrid/activity/AstridActivity.java +++ b/astrid/src/com/todoroo/astrid/activity/AstridActivity.java @@ -4,6 +4,7 @@ import android.app.PendingIntent.CanceledException; import android.content.BroadcastReceiver; import android.content.Context; import android.content.Intent; +import android.content.SharedPreferences; import android.content.res.Configuration; import android.os.Bundle; import android.support.v4.app.Fragment; @@ -23,6 +24,7 @@ import com.todoroo.astrid.api.FilterWithCustomIntent; import com.todoroo.astrid.api.IntentFilter; import com.todoroo.astrid.core.PluginServices; import com.todoroo.astrid.core.SearchFilter; +import com.todoroo.astrid.core.SortHelper; import com.todoroo.astrid.data.TagData; import com.todoroo.astrid.data.Task; import com.todoroo.astrid.reminders.NotificationFragment; @@ -31,7 +33,9 @@ import com.todoroo.astrid.reminders.ReminderDialog; import com.todoroo.astrid.service.StartupService; import com.todoroo.astrid.service.StatisticsConstants; import com.todoroo.astrid.service.StatisticsService; +import com.todoroo.astrid.subtasks.SubtasksListFragment; import com.todoroo.astrid.ui.DateChangedAlerts; +import com.todoroo.astrid.utility.AstridPreferences; /** * This wrapper activity contains all the glue-code to handle the callbacks between the different @@ -189,7 +193,16 @@ public class AstridActivity extends FragmentActivity } protected final void setupTasklistFragmentWithFilter(Filter filter) { - setupTasklistFragmentWithFilterAndCustomTaskList(filter, TaskListFragment.class); + Class customTaskList = TaskListFragment.class; + + if(filter == null || filter.sqlQuery == null) { + SharedPreferences publicPrefs = AstridPreferences.getPublicPrefs(this); + int sortFlags = publicPrefs.getInt(SortHelper.PREF_SORT_FLAGS, 0); + if(SortHelper.isManualSort(sortFlags)) + customTaskList = SubtasksListFragment.class; + } + + setupTasklistFragmentWithFilterAndCustomTaskList(filter, customTaskList); } protected final void setupTasklistFragmentWithFilterAndCustomTaskList(Filter filter, Class customTaskList) { diff --git a/astrid/src/com/todoroo/astrid/activity/SortSelectionActivity.java b/astrid/src/com/todoroo/astrid/activity/SortSelectionActivity.java index 0fbab1639..6f0754686 100644 --- a/astrid/src/com/todoroo/astrid/activity/SortSelectionActivity.java +++ b/astrid/src/com/todoroo/astrid/activity/SortSelectionActivity.java @@ -41,23 +41,34 @@ public class SortSelectionActivity { if((flags & SortHelper.FLAG_SHOW_DELETED) > 0) ((CheckBox)body.findViewById(R.id.deleted)).setChecked(true); - switch(sort) { - case SortHelper.SORT_ALPHA: - ((RadioButton)body.findViewById(R.id.sort_alpha)).setChecked(true); - break; - case SortHelper.SORT_DUE: - ((RadioButton)body.findViewById(R.id.sort_due)).setChecked(true); - break; - case SortHelper.SORT_IMPORTANCE: - ((RadioButton)body.findViewById(R.id.sort_importance)).setChecked(true); - break; - case SortHelper.SORT_MODIFIED: - ((RadioButton)body.findViewById(R.id.sort_modified)).setChecked(true); - break; - default: - ((RadioButton)body.findViewById(R.id.sort_smart)).setChecked(true); + if((flags & SortHelper.FLAG_DRAG_DROP) > 0) + ((RadioButton)body.findViewById(R.id.sort_drag)).setChecked(true); + else { + switch(sort) { + case SortHelper.SORT_ALPHA: + ((RadioButton)body.findViewById(R.id.sort_alpha)).setChecked(true); + break; + case SortHelper.SORT_DUE: + ((RadioButton)body.findViewById(R.id.sort_due)).setChecked(true); + break; + case SortHelper.SORT_IMPORTANCE: + ((RadioButton)body.findViewById(R.id.sort_importance)).setChecked(true); + break; + case SortHelper.SORT_MODIFIED: + ((RadioButton)body.findViewById(R.id.sort_modified)).setChecked(true); + break; + default: + ((RadioButton)body.findViewById(R.id.sort_smart)).setChecked(true); + } } + body.findViewById(R.id.sort_drag).setOnClickListener(new View.OnClickListener() { + @Override + public void onClick(View v) { + // disable reverse + } + }); + AlertDialog dialog = new AlertDialog.Builder(activity). setTitle(R.string.SSD_title). setIcon(android.R.drawable.ic_menu_sort_by_size). @@ -101,6 +112,8 @@ public class SortSelectionActivity { flags |= SortHelper.FLAG_SHOW_HIDDEN; if(((CheckBox)body.findViewById(R.id.deleted)).isChecked()) flags |= SortHelper.FLAG_SHOW_DELETED; + if(((RadioButton)body.findViewById(R.id.sort_drag)).isChecked()) + flags |= SortHelper.FLAG_DRAG_DROP; if(((RadioButton)body.findViewById(R.id.sort_alpha)).isChecked()) sort = SortHelper.SORT_ALPHA; diff --git a/astrid/src/com/todoroo/astrid/activity/TaskListActivity.java b/astrid/src/com/todoroo/astrid/activity/TaskListActivity.java index f86724266..9627ec238 100644 --- a/astrid/src/com/todoroo/astrid/activity/TaskListActivity.java +++ b/astrid/src/com/todoroo/astrid/activity/TaskListActivity.java @@ -142,6 +142,7 @@ public class TaskListActivity extends AstridActivity implements MainMenuListener commentsButton.setOnClickListener(commentsButtonClickListener); Filter savedFilter = getIntent().getParcelableExtra(TaskListFragment.TOKEN_FILTER); + if (getIntent().getIntExtra(TaskListFragment.TOKEN_SOURCE, Constants.SOURCE_DEFAULT) == Constants.SOURCE_NOTIFICATION) setupTasklistFragmentWithFilterAndCustomTaskList(savedFilter, NotificationFragment.class); @@ -435,7 +436,7 @@ public class TaskListActivity extends AstridActivity implements MainMenuListener public void switchToAssignedFilter(final String assignedEmail) { TaskListFragment tlf = getTaskListFragment(); - if (tlf != null && !tlf.isFilter()) { + if (tlf != null && tlf.isInbox()) { DialogInterface.OnClickListener okListener = new DialogInterface.OnClickListener() { @Override public void onClick(DialogInterface dialog, int which) { diff --git a/astrid/src/com/todoroo/astrid/activity/TaskListFragment.java b/astrid/src/com/todoroo/astrid/activity/TaskListFragment.java index 3c5cb46bb..a34d5ae51 100644 --- a/astrid/src/com/todoroo/astrid/activity/TaskListFragment.java +++ b/astrid/src/com/todoroo/astrid/activity/TaskListFragment.java @@ -181,7 +181,7 @@ public class TaskListFragment extends ListFragment implements OnScrollListener, protected QuickAddBar quickAddBar; private Timer backgroundTimer; - private boolean isFilter; + private boolean isInbox; private final TaskListContextMenuExtensionLoader contextMenuExtensionLoader = new TaskListContextMenuExtensionLoader(); @@ -352,10 +352,15 @@ public class TaskListFragment extends ListFragment implements OnScrollListener, return; } else if (extras != null && extras.containsKey(TOKEN_FILTER)) { filter = extras.getParcelable(TOKEN_FILTER); - isFilter = true; - } else { + if(filter.sqlQuery == null) + filter = null; + else + isInbox = false; + } + + if(filter == null) { filter = CoreFilterExposer.buildInboxFilter(getResources()); - isFilter = false; + isInbox = true; } setUpTaskList(); @@ -496,7 +501,6 @@ public class TaskListFragment extends ListFragment implements OnScrollListener, } }); - // animation SharedPreferences publicPrefs = AstridPreferences.getPublicPrefs(getActivity()); sortFlags = publicPrefs.getInt(SortHelper.PREF_SORT_FLAGS, 0); sortSort = publicPrefs.getInt(SortHelper.PREF_SORT_SORT, 0); @@ -946,7 +950,7 @@ public class TaskListFragment extends ListFragment implements OnScrollListener, * task that was completed */ protected void onTaskCompleted(Task item) { - if (isFilter) + if (isInbox) StatisticsService.reportEvent(StatisticsConstants.TASK_COMPLETED_INBOX); else StatisticsService.reportEvent(StatisticsConstants.TASK_COMPLETED_FILTER); @@ -1011,8 +1015,8 @@ public class TaskListFragment extends ListFragment implements OnScrollListener, } } - public boolean isFilter() { - return isFilter; + public boolean isInbox() { + return isInbox; } /** Show a dialog box and delete the task specified */ @@ -1175,6 +1179,6 @@ public class TaskListFragment extends ListFragment implements OnScrollListener, TasksWidget.WidgetUpdateService.class)); } - setUpTaskList(); + ((AstridActivity)getActivity()).onFilterItemClicked(getFilter()); } } diff --git a/astrid/src/com/todoroo/astrid/ui/DraggableListView.java b/astrid/src/com/todoroo/astrid/ui/DraggableListView.java index 23f226acc..c4dcfa106 100644 --- a/astrid/src/com/todoroo/astrid/ui/DraggableListView.java +++ b/astrid/src/com/todoroo/astrid/ui/DraggableListView.java @@ -204,7 +204,7 @@ public class DraggableListView extends ListView { break; } int height = mItemHeightNormal; - int marginBottom = 0; + int marginTop = 0; int visibility = View.VISIBLE; if (vv.equals(first)) { // processing the item that is being dragged @@ -217,7 +217,7 @@ public class DraggableListView extends ListView { } } else if (i == childnum) { if (mDragPos < getCount() - 1) { - marginBottom = mItemHeightNormal; + marginTop = mItemHeightNormal; // height = mItemHeightExpanded; } } @@ -227,7 +227,7 @@ public class DraggableListView extends ListView { params.height = height; vv.setLayoutParams(params); vv.setVisibility(visibility); - vv.setPadding(0, 0, 0, marginBottom); + vv.setPadding(0, marginTop, 0, 0); } } // Request re-layout since we changed the items layout