Add 'Astrid manual sort' mode

pull/1004/head
Alex Baker 4 years ago
parent 72d6bf1620
commit cfb8a4d2fb

@ -323,7 +323,7 @@ class TaskListFragment : InjectingFragment(), OnRefreshListener, Toolbar.OnMenuI
true true
} }
R.id.menu_sort -> { R.id.menu_sort -> {
SortDialog.newSortDialog(filter.supportsManualSort()) SortDialog.newSortDialog(filter)
.show(childFragmentManager, FRAG_TAG_SORT_DIALOG) .show(childFragmentManager, FRAG_TAG_SORT_DIALOG)
true true
} }

@ -27,15 +27,12 @@ class TaskAdapterProvider @Inject constructor(
private val taskDao: TaskDao, private val taskDao: TaskDao,
private val googleTaskDao: GoogleTaskDao, private val googleTaskDao: GoogleTaskDao,
private val caldavDao: CaldavDao, private val caldavDao: CaldavDao,
private val subtasksHelper: SubtasksHelper,
private val localBroadcastManager: LocalBroadcastManager) { private val localBroadcastManager: LocalBroadcastManager) {
fun createTaskAdapter(filter: Filter): TaskAdapter { fun createTaskAdapter(filter: Filter): TaskAdapter {
if (preferences.isManualSort) { if (filter.supportsAstridSorting() && preferences.isAstridSort) {
when { when (filter) {
filter is TagFilter -> return createManualTagTaskAdapter(filter) is TagFilter -> return createManualTagTaskAdapter(filter)
filter is GtasksFilter -> return GoogleTaskManualSortAdapter(googleTaskDao, caldavDao, taskDao, localBroadcastManager) else -> {
filter is CaldavFilter -> return CaldavManualSortTaskAdapter(googleTaskDao, caldavDao, taskDao, localBroadcastManager)
subtasksHelper.shouldUseSubtasksFragmentForFilter(filter) -> {
val adapter = createManualFilterTaskAdapter(filter) val adapter = createManualFilterTaskAdapter(filter)
if (adapter != null) { if (adapter != null) {
return adapter return adapter
@ -43,6 +40,12 @@ class TaskAdapterProvider @Inject constructor(
} }
} }
} }
if (filter.supportsManualSort() && preferences.isManualSort) {
when (filter) {
is GtasksFilter -> return GoogleTaskManualSortAdapter(googleTaskDao, caldavDao, taskDao, localBroadcastManager)
is CaldavFilter -> return CaldavManualSortTaskAdapter(googleTaskDao, caldavDao, taskDao, localBroadcastManager)
}
}
return TaskAdapter(preferences.addTasksToTop(), googleTaskDao, caldavDao, taskDao, localBroadcastManager) return TaskAdapter(preferences.addTasksToTop(), googleTaskDao, caldavDao, taskDao, localBroadcastManager)
} }

@ -181,6 +181,10 @@ public class Filter extends FilterListItem {
source.readMap(valuesForNewTasks, getClass().getClassLoader()); source.readMap(valuesForNewTasks, getClass().getClassLoader());
} }
public boolean supportsAstridSorting() {
return false;
}
public boolean supportsManualSort() { public boolean supportsManualSort() {
return false; return false;
} }

@ -82,7 +82,7 @@ public class TagFilter extends Filter {
} }
@Override @Override
public boolean supportsManualSort() { public boolean supportsAstridSorting() {
return true; return true;
} }

@ -59,7 +59,10 @@ class Upgrader @Inject constructor(
run(from, V8_8) { preferences.setBoolean(R.string.p_linkify_task_edit, true) } run(from, V8_8) { preferences.setBoolean(R.string.p_linkify_task_edit, true) }
run(from, V8_10) { migrateWidgets() } run(from, V8_10) { migrateWidgets() }
run(from, V9_3) { applyCaldavOrder() } run(from, V9_3) { applyCaldavOrder() }
run(from, V9_6) { taskMover.migrateLocalTasks() } run(from, V9_6) {
preferences.setBoolean(R.string.p_astrid_sort_enabled, true)
taskMover.migrateLocalTasks()
}
preferences.setBoolean(R.string.p_just_updated, true) preferences.setBoolean(R.string.p_just_updated, true)
} }
preferences.setCurrentVersion(to) preferences.setCurrentVersion(to)

@ -4,9 +4,7 @@ import static org.tasks.Strings.isNullOrEmpty;
import static org.tasks.db.QueryUtils.showHiddenAndCompleted; import static org.tasks.db.QueryUtils.showHiddenAndCompleted;
import android.content.Context; import android.content.Context;
import androidx.annotation.NonNull;
import com.todoroo.astrid.api.Filter; import com.todoroo.astrid.api.Filter;
import com.todoroo.astrid.api.TagFilter;
import com.todoroo.astrid.core.BuiltInFilterExposer; import com.todoroo.astrid.core.BuiltInFilterExposer;
import com.todoroo.astrid.dao.TaskDao; import com.todoroo.astrid.dao.TaskDao;
import com.todoroo.astrid.data.Task; import com.todoroo.astrid.data.Task;
@ -20,7 +18,6 @@ import org.tasks.data.TagData;
import org.tasks.data.TagDataDao; import org.tasks.data.TagDataDao;
import org.tasks.data.TaskListMetadata; import org.tasks.data.TaskListMetadata;
import org.tasks.data.TaskListMetadataDao; import org.tasks.data.TaskListMetadataDao;
import org.tasks.filters.SortableFilter;
import org.tasks.injection.ForApplication; import org.tasks.injection.ForApplication;
import org.tasks.preferences.Preferences; import org.tasks.preferences.Preferences;
import timber.log.Timber; import timber.log.Timber;
@ -127,13 +124,8 @@ public class SubtasksHelper {
return map; return map;
} }
public boolean shouldUseSubtasksFragmentForFilter(@NonNull Filter filter) {
return preferences.isManualSort()
&& (filter instanceof SortableFilter || filter instanceof TagFilter);
}
public String applySubtasksToWidgetFilter(Filter filter, String query) { public String applySubtasksToWidgetFilter(Filter filter, String query) {
if (shouldUseSubtasksFragmentForFilter(filter)) { if (filter.supportsAstridSorting() && preferences.isAstridSort()) {
TagData tagData = tagDataDao.getTagByName(filter.listingTitle); TagData tagData = tagDataDao.getTagByName(filter.listingTitle);
TaskListMetadata tlm = null; TaskListMetadata tlm = null;
if (tagData != null) { if (tagData != null) {

@ -4,9 +4,7 @@ import com.todoroo.andlib.sql.Criterion
import com.todoroo.andlib.sql.Field.Companion.field import com.todoroo.andlib.sql.Field.Companion.field
import com.todoroo.andlib.sql.Join import com.todoroo.andlib.sql.Join
import com.todoroo.astrid.activity.TaskListFragment import com.todoroo.astrid.activity.TaskListFragment
import com.todoroo.astrid.api.CaldavFilter
import com.todoroo.astrid.api.Filter import com.todoroo.astrid.api.Filter
import com.todoroo.astrid.api.GtasksFilter
import com.todoroo.astrid.data.Task import com.todoroo.astrid.data.Task
import kotlinx.collections.immutable.persistentListOf import kotlinx.collections.immutable.persistentListOf
import org.tasks.data.TaskListQueryNonRecursive.getNonRecursiveQuery import org.tasks.data.TaskListQueryNonRecursive.getNonRecursiveQuery
@ -35,14 +33,11 @@ object TaskListQuery {
@JvmStatic @JvmStatic
fun getQuery(preferences: Preferences, filter: Filter, subtasks: SubtaskInfo): List<String> { fun getQuery(preferences: Preferences, filter: Filter, subtasks: SubtaskInfo): List<String> {
if (filter.supportsManualSort() && preferences.isManualSort) { return if (filter.supportsManualSort() && preferences.isManualSort) {
return if (filter is GtasksFilter || filter is CaldavFilter) { getRecursiveQuery(filter, preferences, subtasks)
getRecursiveQuery(filter, preferences, subtasks) } else if (filter.supportsAstridSorting() && preferences.isAstridSort) {
} else { getNonRecursiveQuery(filter, preferences)
getNonRecursiveQuery(filter, preferences) } else if (filter.supportsSubtasks() && subtasks.usesSubtasks() && preferences.showSubtasks()) {
}
}
return if (filter.supportsSubtasks() && subtasks.usesSubtasks() && preferences.showSubtasks()) {
getRecursiveQuery(filter, preferences, subtasks) getRecursiveQuery(filter, preferences, subtasks)
} else { } else {
getNonRecursiveQuery(filter, preferences) getNonRecursiveQuery(filter, preferences)

@ -7,6 +7,7 @@ import android.os.Bundle;
import android.widget.Button; import android.widget.Button;
import androidx.annotation.NonNull; import androidx.annotation.NonNull;
import androidx.appcompat.app.AlertDialog; import androidx.appcompat.app.AlertDialog;
import com.todoroo.astrid.api.Filter;
import com.todoroo.astrid.core.SortHelper; import com.todoroo.astrid.core.SortHelper;
import java.util.ArrayList; import java.util.ArrayList;
import java.util.List; import java.util.List;
@ -20,18 +21,21 @@ import timber.log.Timber;
public class SortDialog extends InjectingDialogFragment { public class SortDialog extends InjectingDialogFragment {
private static final String EXTRA_MANUAL_ENABLED = "extra_manual_enabled"; private static final String EXTRA_MANUAL_ENABLED = "extra_manual_enabled";
private static final String EXTRA_ASTRID_ENABLED = "extra_astrid_enabled";
private static final String EXTRA_SELECTED_INDEX = "extra_selected_index"; private static final String EXTRA_SELECTED_INDEX = "extra_selected_index";
@Inject Preferences preferences; @Inject Preferences preferences;
@Inject DialogBuilder dialogBuilder; @Inject DialogBuilder dialogBuilder;
private boolean manualEnabled; private boolean manualEnabled;
private boolean astridEnabled;
private int selectedIndex; private int selectedIndex;
private AlertDialog alertDialog; private AlertDialog alertDialog;
private SortDialogCallback callback; private SortDialogCallback callback;
public static SortDialog newSortDialog(boolean manualEnabled) { public static SortDialog newSortDialog(Filter filter) {
SortDialog sortDialog = new SortDialog(); SortDialog sortDialog = new SortDialog();
Bundle args = new Bundle(); Bundle args = new Bundle();
args.putBoolean(EXTRA_MANUAL_ENABLED, manualEnabled); args.putBoolean(EXTRA_MANUAL_ENABLED, filter.supportsManualSort());
args.putBoolean(EXTRA_ASTRID_ENABLED, filter.supportsAstridSorting());
sortDialog.setArguments(args); sortDialog.setArguments(args);
return sortDialog; return sortDialog;
} }
@ -43,9 +47,9 @@ public class SortDialog extends InjectingDialogFragment {
Bundle arguments = getArguments(); Bundle arguments = getArguments();
manualEnabled = arguments.getBoolean(EXTRA_MANUAL_ENABLED); manualEnabled = arguments.getBoolean(EXTRA_MANUAL_ENABLED);
astridEnabled = arguments.getBoolean(EXTRA_ASTRID_ENABLED) && preferences.getBoolean(R.string.p_astrid_sort_enabled, false);
if (savedInstanceState != null) { if (savedInstanceState != null) {
manualEnabled = savedInstanceState.getBoolean(EXTRA_MANUAL_ENABLED);
selectedIndex = savedInstanceState.getInt(EXTRA_SELECTED_INDEX); selectedIndex = savedInstanceState.getInt(EXTRA_SELECTED_INDEX);
} else { } else {
selectedIndex = getIndex(preferences.getSortMode()); selectedIndex = getIndex(preferences.getSortMode());
@ -55,6 +59,8 @@ public class SortDialog extends InjectingDialogFragment {
if (manualEnabled) { if (manualEnabled) {
items.add(getString(R.string.SSD_sort_my_order)); items.add(getString(R.string.SSD_sort_my_order));
} else if (astridEnabled) {
items.add(getString(R.string.astrid_sort_order));
} }
items.add(getString(R.string.SSD_sort_auto)); items.add(getString(R.string.SSD_sort_auto));
@ -68,6 +74,10 @@ public class SortDialog extends InjectingDialogFragment {
if (preferences.isManualSort()) { if (preferences.isManualSort()) {
selectedIndex = 0; selectedIndex = 0;
} }
} else if (astridEnabled) {
if (preferences.isAstridSort()) {
selectedIndex = 0;
}
} else { } else {
selectedIndex -= 1; selectedIndex -= 1;
} }
@ -103,7 +113,6 @@ public class SortDialog extends InjectingDialogFragment {
public void onSaveInstanceState(Bundle outState) { public void onSaveInstanceState(Bundle outState) {
super.onSaveInstanceState(outState); super.onSaveInstanceState(outState);
outState.putBoolean(EXTRA_MANUAL_ENABLED, manualEnabled);
outState.putInt(EXTRA_SELECTED_INDEX, selectedIndex); outState.putInt(EXTRA_SELECTED_INDEX, selectedIndex);
} }
@ -118,14 +127,17 @@ public class SortDialog extends InjectingDialogFragment {
preferences.setBoolean(R.string.p_reverse_sort, reverse); preferences.setBoolean(R.string.p_reverse_sort, reverse);
boolean wasManual = preferences.isManualSort(); boolean wasManual = preferences.isManualSort();
boolean wasAstrid = preferences.isAstridSort();
boolean isManual = manualEnabled && selectedIndex == 0; boolean isManual = manualEnabled && selectedIndex == 0;
boolean isAstrid = astridEnabled && selectedIndex == 0;
preferences.setBoolean(R.string.p_manual_sort, isManual); preferences.setBoolean(R.string.p_manual_sort, isManual);
preferences.setBoolean(R.string.p_astrid_sort, isAstrid);
if (!isManual) { if (!isManual && !isAstrid) {
preferences.setSortMode(getSortMode(manualEnabled ? selectedIndex : selectedIndex + 1)); preferences.setSortMode(getSortMode(manualEnabled || astridEnabled ? selectedIndex : selectedIndex + 1));
} }
callback.sortChanged(wasManual != isManual); callback.sortChanged(wasManual != isManual || wasAstrid != isAstrid);
} }
private int getIndex(int sortMode) { private int getIndex(int sortMode) {
@ -174,7 +186,6 @@ public class SortDialog extends InjectingDialogFragment {
} }
public interface SortDialogCallback { public interface SortDialogCallback {
void sortChanged(boolean reload); void sortChanged(boolean reload);
} }
} }

@ -38,7 +38,7 @@ public class SortableFilter extends Filter {
private SortableFilter() {} private SortableFilter() {}
@Override @Override
public boolean supportsManualSort() { public boolean supportsAstridSorting() {
return true; return true;
} }
} }

@ -514,6 +514,10 @@ public class Preferences {
return getBoolean(R.string.p_manual_sort, false); return getBoolean(R.string.p_manual_sort, false);
} }
public boolean isAstridSort() {
return getBoolean(R.string.p_astrid_sort_enabled, false) && getBoolean(R.string.p_astrid_sort, false);
}
public boolean isReverseSort() { public boolean isReverseSort() {
return getBoolean(R.string.p_reverse_sort, false); return getBoolean(R.string.p_reverse_sort, false);
} }

@ -271,7 +271,9 @@ class DragAndDropRecyclerAdapter(
init { init {
val filter = taskList.getFilter() val filter = taskList.getFilter()
disableHeaders = !filter.supportsSorting() || preferences.isManualSort && filter.supportsManualSort() disableHeaders = !filter.supportsSorting()
|| (filter.supportsManualSort() && preferences.isManualSort)
|| (filter.supportsAstridSorting() && preferences.isAstridSort)
itemTouchHelper = ItemTouchHelper(ItemTouchHelperCallback()) itemTouchHelper = ItemTouchHelper(ItemTouchHelperCallback())
itemTouchHelper.attachToRecyclerView(recyclerView) itemTouchHelper.attachToRecyclerView(recyclerView)
list = SectionedDataSource(tasks, disableHeaders, preferences.sortMode, adapter.getCollapsed().toMutableSet()) list = SectionedDataSource(tasks, disableHeaders, preferences.sortMode, adapter.getCollapsed().toMutableSet())

@ -53,7 +53,9 @@ public class TaskListViewModel extends ViewModel implements Observer<PagedList<T
tasks = new MutableLiveData<>(); tasks = new MutableLiveData<>();
invalidate(); invalidate();
} }
manualSortFilter = filter.supportsManualSort() && preferences.isManualSort(); manualSortFilter =
(filter.supportsManualSort() && preferences.isManualSort())
|| (filter.supportsAstridSorting() && preferences.isAstridSort());
} }
public void observe(LifecycleOwner owner, Observer<List<TaskContainer>> observer) { public void observe(LifecycleOwner owner, Observer<List<TaskContainer>> observer) {

@ -246,6 +246,8 @@
<string name="p_temporarily_show_completed_tasks">temporarily_show_completed_tasks</string> <string name="p_temporarily_show_completed_tasks">temporarily_show_completed_tasks</string>
<string name="p_reverse_sort">reverse_sort</string> <string name="p_reverse_sort">reverse_sort</string>
<string name="p_manual_sort">manual_sort</string> <string name="p_manual_sort">manual_sort</string>
<string name="p_astrid_sort">astrid_sort</string>
<string name="p_astrid_sort_enabled">astrid_sort_enabled</string>
<string-array name="TEA_control_sets_prefs"> <string-array name="TEA_control_sets_prefs">
<item>@string/TEA_ctrl_when_pref</item> <item>@string/TEA_ctrl_when_pref</item>

@ -33,6 +33,8 @@ File %1$s contained %2$s.\n\n
<string name="action_call">Call</string> <string name="action_call">Call</string>
<string name="action_open">Open</string> <string name="action_open">Open</string>
<string name="SSD_sort_my_order">My order</string> <string name="SSD_sort_my_order">My order</string>
<string name="astrid_sort_order">Astrid manual sorting</string>
<string name="astrid_sort_order_summary">Enable Astrid\'s manual sort mode for \'My Tasks\', \'Today\', and tags. This sort mode will be replaced by \'My order\' in a future update</string>
<string name="SSD_sort_auto">Smart sort</string> <string name="SSD_sort_auto">Smart sort</string>
<string name="SSD_sort_alpha">By title</string> <string name="SSD_sort_alpha">By title</string>
<string name="SSD_sort_due">By due date</string> <string name="SSD_sort_due">By due date</string>

@ -8,6 +8,12 @@
android:summary="@string/improve_performance_summary" android:summary="@string/improve_performance_summary"
android:title="@string/improve_performance" /> android:title="@string/improve_performance" />
<SwitchPreferenceCompat
android:defaultValue="false"
android:key="@string/p_astrid_sort_enabled"
android:title="@string/astrid_sort_order"
android:summary="@string/astrid_sort_order_summary" />
<Preference <Preference
android:icon="@drawable/ic_outline_attachment_24px" android:icon="@drawable/ic_outline_attachment_24px"
android:key="@string/p_attachment_dir" android:key="@string/p_attachment_dir"

Loading…
Cancel
Save