Remove TaskListFragment subclasses

pull/795/head
Alex Baker 5 years ago
parent 8d9972c4c3
commit 1ba7c09cee

@ -29,19 +29,11 @@ import androidx.fragment.app.FragmentManager;
import androidx.lifecycle.ViewModelProviders;
import butterknife.BindView;
import butterknife.ButterKnife;
import com.todoroo.astrid.api.CaldavFilter;
import com.todoroo.astrid.api.Filter;
import com.todoroo.astrid.api.FilterListItem;
import com.todoroo.astrid.api.GtasksFilter;
import com.todoroo.astrid.api.TagFilter;
import com.todoroo.astrid.dao.TaskDao;
import com.todoroo.astrid.data.Task;
import com.todoroo.astrid.gtasks.GtasksListService;
import com.todoroo.astrid.gtasks.GtasksSubtaskListFragment;
import com.todoroo.astrid.service.TaskCreator;
import com.todoroo.astrid.subtasks.SubtasksHelper;
import com.todoroo.astrid.subtasks.SubtasksListFragment;
import com.todoroo.astrid.subtasks.SubtasksTagListFragment;
import com.todoroo.astrid.timers.TimerControlSet;
import io.reactivex.Single;
import io.reactivex.android.schedulers.AndroidSchedulers;
@ -54,12 +46,6 @@ import org.tasks.R;
import org.tasks.activities.TagSettingsActivity;
import org.tasks.analytics.Tracker;
import org.tasks.analytics.Tracking;
import org.tasks.caldav.CaldavListFragment;
import org.tasks.data.CaldavCalendar;
import org.tasks.data.CaldavDao;
import org.tasks.data.GoogleTaskList;
import org.tasks.data.TagData;
import org.tasks.data.TagDataDao;
import org.tasks.dialogs.SortDialog;
import org.tasks.fragments.CommentBarFragment;
import org.tasks.gtasks.PlayServices;
@ -68,9 +54,6 @@ import org.tasks.injection.InjectingAppCompatActivity;
import org.tasks.preferences.DefaultFilterProvider;
import org.tasks.preferences.Preferences;
import org.tasks.receivers.RepeatConfirmationReceiver;
import org.tasks.sync.SyncAdapters;
import org.tasks.tasklist.GtasksListFragment;
import org.tasks.tasklist.TagListFragment;
import org.tasks.themes.Theme;
import org.tasks.themes.ThemeCache;
import org.tasks.themes.ThemeColor;
@ -102,17 +85,12 @@ public class MainActivity extends InjectingAppCompatActivity
private static final String EXTRA_FILTER = "extra_filter";
@Inject Preferences preferences;
@Inject SubtasksHelper subtasksHelper;
@Inject RepeatConfirmationReceiver repeatConfirmationReceiver;
@Inject DefaultFilterProvider defaultFilterProvider;
@Inject GtasksListService gtasksListService;
@Inject TagDataDao tagDataDao;
@Inject Theme theme;
@Inject ThemeCache themeCache;
@Inject SyncAdapters syncAdapters;
@Inject Tracker tracker;
@Inject TaskDao taskDao;
@Inject CaldavDao caldavDao;
@Inject LocalBroadcastManager localBroadcastManager;
@Inject TaskCreator taskCreator;
@Inject PlayServices playServices;
@ -403,35 +381,7 @@ public class MainActivity extends InjectingAppCompatActivity
filter = defaultFilterProvider.getDefaultFilter();
}
if (filter instanceof TagFilter) {
TagFilter tagFilter = (TagFilter) filter;
TagData tagData = tagDataDao.getByUuid(tagFilter.getUuid());
if (tagData != null) {
return preferences.getBoolean(R.string.p_manual_sort, false)
? SubtasksTagListFragment.newSubtasksTagListFragment(tagFilter, tagData)
: TagListFragment.newTagViewFragment(tagFilter, tagData);
}
} else if (filter instanceof GtasksFilter) {
GtasksFilter gtasksFilter = (GtasksFilter) filter;
GoogleTaskList list = gtasksListService.getList(gtasksFilter.getStoreId());
if (list != null) {
return preferences.getBoolean(R.string.p_manual_sort, false)
? GtasksSubtaskListFragment.newGtasksSubtaskListFragment(gtasksFilter, list)
: GtasksListFragment.newGtasksListFragment(gtasksFilter, list);
}
} else if (filter instanceof CaldavFilter) {
CaldavFilter caldavFilter = (CaldavFilter) filter;
CaldavCalendar calendar = caldavDao.getCalendarByUuid(caldavFilter.getUuid());
if (calendar != null) {
return CaldavListFragment.newCaldavListFragment(caldavFilter, calendar);
}
} else if (filter != null) {
return subtasksHelper.shouldUseSubtasksFragmentForFilter(filter)
? SubtasksListFragment.newSubtasksListFragment(filter)
: TaskListFragment.newTaskListFragment(filter);
}
return null;
return TaskListFragment.newTaskListFragment(filter);
}
@Override

@ -9,6 +9,7 @@ package com.todoroo.astrid.activity;
import static android.app.Activity.RESULT_OK;
import static androidx.core.content.ContextCompat.getColor;
import static com.todoroo.andlib.utility.AndroidUtilities.assertMainThread;
import static org.tasks.caldav.CaldavCalendarSettingsActivity.EXTRA_CALDAV_CALENDAR;
import android.app.Activity;
import android.content.BroadcastReceiver;
@ -37,13 +38,17 @@ import butterknife.OnClick;
import com.google.android.material.snackbar.Snackbar;
import com.todoroo.andlib.sql.Criterion;
import com.todoroo.andlib.sql.QueryTemplate;
import com.todoroo.astrid.adapter.GoogleTaskAdapter;
import com.todoroo.astrid.adapter.TaskAdapter;
import com.todoroo.astrid.adapter.TaskAdapterProvider;
import com.todoroo.astrid.api.CaldavFilter;
import com.todoroo.astrid.api.CustomFilter;
import com.todoroo.astrid.api.Filter;
import com.todoroo.astrid.api.GtasksFilter;
import com.todoroo.astrid.api.SearchFilter;
import com.todoroo.astrid.api.TagFilter;
import com.todoroo.astrid.core.BuiltInFilterExposer;
import com.todoroo.astrid.data.Task;
import com.todoroo.astrid.gtasks.GtasksSubtaskListFragment;
import com.todoroo.astrid.service.TaskCreator;
import com.todoroo.astrid.service.TaskDeleter;
import com.todoroo.astrid.service.TaskMover;
@ -60,9 +65,12 @@ import javax.inject.Inject;
import org.tasks.LocalBroadcastManager;
import org.tasks.R;
import org.tasks.activities.FilterSettingsActivity;
import org.tasks.activities.GoogleTaskListSettingsActivity;
import org.tasks.activities.RemoteListSupportPicker;
import org.tasks.activities.TagSettingsActivity;
import org.tasks.analytics.Tracker;
import org.tasks.analytics.Tracking;
import org.tasks.caldav.CaldavCalendarSettingsActivity;
import org.tasks.dialogs.DialogBuilder;
import org.tasks.dialogs.SortDialog;
import org.tasks.injection.ForActivity;
@ -84,19 +92,22 @@ import org.tasks.ui.Toaster;
*
* @author Tim Su <tim@todoroo.com>
*/
public class TaskListFragment extends InjectingFragment
public final class TaskListFragment extends InjectingFragment
implements SwipeRefreshLayout.OnRefreshListener, Toolbar.OnMenuItemClickListener {
public static final String TAGS_METADATA_JOIN = "for_tags"; // $NON-NLS-1$
public static final String GTASK_METADATA_JOIN = "for_gtask"; // $NON-NLS-1$
public static final String CALDAV_METADATA_JOIN = "for_caldav"; // $NON-NLS-1$
public static final String FILE_METADATA_JOIN = "for_actions"; // $NON-NLS-1$
public static final int REQUEST_MOVE_TASKS = 11545;
private static final int VOICE_RECOGNITION_REQUEST_CODE = 1234;
private static final String EXTRA_FILTER = "extra_filter";
private static final String FRAG_TAG_SORT_DIALOG = "frag_tag_sort_dialog";
// --- instance variables
private static final int REQUEST_EDIT_FILTER = 11544;
private static final int REQUEST_CALDAV_SETTINGS = 10101;
private static final int REQUEST_GTASK_SETTINGS = 10102;
public static final int REQUEST_MOVE_TASKS = 10103;
private static final int REQUEST_FILTER_SETTINGS = 10104;
private static final int REQUEST_TAG_SETTINGS = 10105;
private static final int SEARCH_DEBOUNCE_TIMEOUT = 300;
@Inject protected Tracker tracker;
@Inject SyncAdapters syncAdapters;
@ -113,6 +124,7 @@ public class TaskListFragment extends InjectingFragment
@Inject TaskMover taskMover;
@Inject ActionModeProvider actionModeProvider;
@Inject Toaster toaster;
@Inject TaskAdapterProvider taskAdapterProvider;
@BindView(R.id.swipe_layout)
SwipeRefreshLayout swipeRefreshLayout;
@ -164,7 +176,7 @@ public class TaskListFragment extends InjectingFragment
}));
}
protected void setSyncOngoing(final boolean ongoing) {
private void setSyncOngoing(final boolean ongoing) {
assertMainThread();
swipeRefreshLayout.setRefreshing(ongoing);
@ -209,7 +221,11 @@ public class TaskListFragment extends InjectingFragment
filter.setFilterQueryOverride(null);
setTaskAdapter();
// set up list adapters
taskAdapter = taskAdapterProvider.createTaskAdapter(filter);
recyclerAdapter =
new TaskListRecyclerAdapter(taskAdapter, viewHolderFactory, this, actionModeProvider);
taskAdapter.setHelper(recyclerAdapter.getAsyncPagedListDiffer());
}
@Override
@ -231,22 +247,23 @@ public class TaskListFragment extends InjectingFragment
toolbar.setTitle(filter.listingTitle);
toolbar.setNavigationIcon(R.drawable.ic_outline_menu_24px);
toolbar.setNavigationOnClickListener(v -> callbacks.onNavigationIconClicked());
inflateMenu(toolbar);
setupMenu(toolbar.getMenu());
setupMenu(toolbar);
toolbar.setOnMenuItemClickListener(this);
MenuColorizer.colorToolbar(context, toolbar);
return parent;
}
protected void inflateMenu(Toolbar toolbar) {
private void setupMenu(Toolbar toolbar) {
toolbar.inflateMenu(R.menu.menu_task_list_fragment);
if (filter instanceof CustomFilter && ((CustomFilter) filter).getId() > 0) {
toolbar.inflateMenu(R.menu.menu_custom_filter);
}
}
private void setupMenu(Menu menu) {
int menuRes = filter.getMenu();
if (menuRes > 0) {
toolbar.inflateMenu(menuRes);
}
Menu menu = toolbar.getMenu();
MenuItem hidden = menu.findItem(R.id.menu_show_hidden);
if (preferences.getBoolean(R.string.p_show_hidden_tasks, false)) {
hidden.setChecked(true);
@ -348,7 +365,10 @@ public class TaskListFragment extends InjectingFragment
startActivityForResult(recognition, TaskListFragment.VOICE_RECOGNITION_REQUEST_CODE);
return true;
case R.id.menu_sort:
SortDialog.newSortDialog(hasDraggableOption())
boolean supportsManualSort = filter.supportsSubtasks()
|| BuiltInFilterExposer.isInbox(context, filter)
|| BuiltInFilterExposer.isTodayFilter(context, filter);
SortDialog.newSortDialog(supportsManualSort)
.show(getChildFragmentManager(), FRAG_TAG_SORT_DIALOG);
return true;
case R.id.menu_show_hidden:
@ -363,11 +383,6 @@ public class TaskListFragment extends InjectingFragment
loadTaskListContent();
localBroadcastManager.broadcastRefresh();
return true;
case R.id.menu_filter_settings:
Intent intent = new Intent(getActivity(), FilterSettingsActivity.class);
intent.putExtra(FilterSettingsActivity.TOKEN_FILTER, filter);
startActivityForResult(intent, REQUEST_EDIT_FILTER);
return true;
case R.id.menu_clear_completed:
dialogBuilder
.newMessageDialog(R.string.clear_completed_tasks_confirmation)
@ -375,12 +390,32 @@ public class TaskListFragment extends InjectingFragment
.setNegativeButton(android.R.string.cancel, null)
.show();
return true;
case R.id.menu_filter_settings:
Intent filterSettings = new Intent(getActivity(), FilterSettingsActivity.class);
filterSettings.putExtra(FilterSettingsActivity.TOKEN_FILTER, filter);
startActivityForResult(filterSettings, REQUEST_FILTER_SETTINGS);
return true;
case R.id.menu_caldav_list_fragment:
Intent caldavSettings = new Intent(getActivity(), CaldavCalendarSettingsActivity.class);
caldavSettings.putExtra(EXTRA_CALDAV_CALENDAR, ((CaldavFilter) filter).getCalendar());
startActivityForResult(caldavSettings, REQUEST_CALDAV_SETTINGS);
return true;
case R.id.menu_gtasks_list_settings:
Intent gtasksSettings = new Intent(getActivity(), GoogleTaskListSettingsActivity.class);
gtasksSettings.putExtra(GoogleTaskListSettingsActivity.EXTRA_STORE_DATA, ((GtasksFilter) filter).getList());
startActivityForResult(gtasksSettings, REQUEST_GTASK_SETTINGS);
return true;
case R.id.menu_tag_settings:
Intent tagSettings = new Intent(getActivity(), TagSettingsActivity.class);
tagSettings.putExtra(TagSettingsActivity.EXTRA_TAG_DATA, ((TagFilter) filter).getTagData());
startActivityForResult(tagSettings, REQUEST_TAG_SETTINGS);
return true;
default:
return onOptionsItemSelected(item);
}
}
protected void clearCompleted() {
private void clearCompleted() {
tracker.reportEvent(Tracking.Events.CLEAR_COMPLETED);
disposables.add(
Single.fromCallable(() -> taskDeleter.clearCompleted(filter))
@ -476,7 +511,7 @@ public class TaskListFragment extends InjectingFragment
*/
private void refresh() {
// TODO: compare indents in diff callback, then animate this
loadTaskListContent(!(this instanceof GtasksSubtaskListFragment));
loadTaskListContent(!(taskAdapter instanceof GoogleTaskAdapter));
setSyncOngoing(preferences.isSyncOngoing());
}
@ -497,23 +532,6 @@ public class TaskListFragment extends InjectingFragment
taskListViewModel.invalidate();
}
protected TaskAdapter createTaskAdapter() {
return new TaskAdapter();
}
/** Fill in the Task List with current items */
private void setTaskAdapter() {
if (filter == null) {
return;
}
// set up list adapters
taskAdapter = createTaskAdapter();
recyclerAdapter =
new TaskListRecyclerAdapter(taskAdapter, viewHolderFactory, this, actionModeProvider);
taskAdapter.setHelper(recyclerAdapter.getAsyncPagedListDiffer());
}
public Filter getFilter() {
return filter;
}
@ -561,43 +579,95 @@ public class TaskListFragment extends InjectingFragment
@Override
public void onActivityResult(int requestCode, int resultCode, Intent data) {
if (requestCode == VOICE_RECOGNITION_REQUEST_CODE) {
if (resultCode == RESULT_OK) {
List<String> match = data.getStringArrayListExtra(RecognizerIntent.EXTRA_RESULTS);
if (match != null && match.size() > 0 && match.get(0).length() > 0) {
String recognizedSpeech = match.get(0);
recognizedSpeech =
recognizedSpeech.substring(0, 1).toUpperCase()
+ recognizedSpeech.substring(1).toLowerCase();
onTaskListItemClicked(addTask(recognizedSpeech));
switch (requestCode) {
case VOICE_RECOGNITION_REQUEST_CODE:
if (resultCode == RESULT_OK) {
List<String> match = data.getStringArrayListExtra(RecognizerIntent.EXTRA_RESULTS);
if (match != null && match.size() > 0 && match.get(0).length() > 0) {
String recognizedSpeech = match.get(0);
recognizedSpeech =
recognizedSpeech.substring(0, 1).toUpperCase()
+ recognizedSpeech.substring(1).toLowerCase();
onTaskListItemClicked(addTask(recognizedSpeech));
}
}
}
} else if (requestCode == REQUEST_EDIT_FILTER) {
if (resultCode == RESULT_OK) {
String action = data.getAction();
MainActivity activity = (MainActivity) getActivity();
if (FilterSettingsActivity.ACTION_FILTER_DELETED.equals(action)) {
activity.onFilterItemClicked(null);
} else if (FilterSettingsActivity.ACTION_FILTER_RENAMED.equals(action)) {
activity
.getIntent()
.putExtra(
MainActivity.OPEN_FILTER,
(Filter) data.getParcelableExtra(FilterSettingsActivity.TOKEN_FILTER));
activity.recreate();
break;
case REQUEST_FILTER_SETTINGS:
if (resultCode == RESULT_OK) {
String action = data.getAction();
MainActivity activity = (MainActivity) getActivity();
if (FilterSettingsActivity.ACTION_FILTER_DELETED.equals(action)) {
activity.onFilterItemClicked(null);
} else if (FilterSettingsActivity.ACTION_FILTER_RENAMED.equals(action)) {
activity
.getIntent()
.putExtra(
MainActivity.OPEN_FILTER,
(Filter) data.getParcelableExtra(FilterSettingsActivity.TOKEN_FILTER));
activity.recreate();
}
}
}
} else if (requestCode == REQUEST_MOVE_TASKS) {
if (resultCode == RESULT_OK) {
tracker.reportEvent(Tracking.Events.MULTISELECT_MOVE);
taskMover.move(
taskAdapter.getSelected(),
data.getParcelableExtra(RemoteListSupportPicker.EXTRA_SELECTED_FILTER));
recyclerAdapter.finishActionMode();
}
} else {
super.onActivityResult(requestCode, resultCode, data);
break;
case REQUEST_MOVE_TASKS:
if (resultCode == RESULT_OK) {
tracker.reportEvent(Tracking.Events.MULTISELECT_MOVE);
taskMover.move(
taskAdapter.getSelected(),
data.getParcelableExtra(RemoteListSupportPicker.EXTRA_SELECTED_FILTER));
recyclerAdapter.finishActionMode();
}
break;
case REQUEST_CALDAV_SETTINGS:
if (resultCode == RESULT_OK) {
MainActivity activity = (MainActivity) getActivity();
String action = data.getAction();
if (CaldavCalendarSettingsActivity.ACTION_DELETED.equals(action)) {
activity.onFilterItemClicked(null);
} else if (CaldavCalendarSettingsActivity.ACTION_RELOAD.equals(action)) {
activity
.getIntent()
.putExtra(
MainActivity.OPEN_FILTER,
(Filter) data.getParcelableExtra(MainActivity.OPEN_FILTER));
activity.recreate();
}
}
break;
case REQUEST_GTASK_SETTINGS:
if (resultCode == RESULT_OK) {
MainActivity activity = (MainActivity) getActivity();
String action = data.getAction();
if (GoogleTaskListSettingsActivity.ACTION_DELETED.equals(action)) {
activity.onFilterItemClicked(null);
} else if (GoogleTaskListSettingsActivity.ACTION_RELOAD.equals(action)) {
activity
.getIntent()
.putExtra(
MainActivity.OPEN_FILTER,
(Filter) data.getParcelableExtra(MainActivity.OPEN_FILTER));
activity.recreate();
}
}
break;
case REQUEST_TAG_SETTINGS:
if (resultCode == Activity.RESULT_OK) {
String action = data.getAction();
MainActivity activity = (MainActivity) getActivity();
if (TagSettingsActivity.ACTION_DELETED.equals(action)) {
activity.onFilterItemClicked(null);
} else if (TagSettingsActivity.ACTION_RELOAD.equals(action)) {
activity
.getIntent()
.putExtra(
MainActivity.OPEN_FILTER,
(Filter) data.getParcelableExtra(MainActivity.OPEN_FILTER));
activity.recreate();
}
}
break;
default:
super.onActivityResult(requestCode, resultCode, data);
}
}
@ -610,11 +680,6 @@ public class TaskListFragment extends InjectingFragment
callbacks.onTaskListItemClicked(task);
}
protected boolean hasDraggableOption() {
return BuiltInFilterExposer.isInbox(context, filter)
|| BuiltInFilterExposer.isTodayFilter(context, filter);
}
/**
* Container Activity must implement this interface and we ensure that it does during the
* onAttach() callback

@ -0,0 +1,149 @@
package com.todoroo.astrid.adapter;
import android.content.Context;
import android.text.TextUtils;
import com.todoroo.astrid.api.CaldavFilter;
import com.todoroo.astrid.api.Filter;
import com.todoroo.astrid.api.GtasksFilter;
import com.todoroo.astrid.api.TagFilter;
import com.todoroo.astrid.core.BuiltInFilterExposer;
import com.todoroo.astrid.dao.TaskDao;
import com.todoroo.astrid.data.Task;
import com.todoroo.astrid.gtasks.GtasksListService;
import com.todoroo.astrid.gtasks.GtasksTaskListUpdater;
import com.todoroo.astrid.gtasks.sync.GtasksSyncService;
import com.todoroo.astrid.subtasks.SubtasksFilterUpdater;
import com.todoroo.astrid.subtasks.SubtasksHelper;
import javax.inject.Inject;
import org.tasks.R;
import org.tasks.data.CaldavCalendar;
import org.tasks.data.CaldavDao;
import org.tasks.data.GoogleTaskDao;
import org.tasks.data.GoogleTaskList;
import org.tasks.data.TagData;
import org.tasks.data.TagDataDao;
import org.tasks.data.TaskListMetadata;
import org.tasks.data.TaskListMetadataDao;
import org.tasks.injection.ForApplication;
import org.tasks.preferences.Preferences;
public class TaskAdapterProvider {
private final Context context;
private final Preferences preferences;
private final TagDataDao tagDataDao;
private final TaskListMetadataDao taskListMetadataDao;
private final TaskDao taskDao;
private final GtasksListService gtasksListService;
private final GtasksSyncService gtasksSyncService;
private final GoogleTaskDao googleTaskDao;
private final CaldavDao caldavDao;
private final SubtasksHelper subtasksHelper;
@Inject
public TaskAdapterProvider(
@ForApplication Context context,
Preferences preferences,
TagDataDao tagDataDao,
TaskListMetadataDao taskListMetadataDao,
TaskDao taskDao,
GtasksListService gtasksListService,
GtasksSyncService gtasksSyncService,
GoogleTaskDao googleTaskDao,
CaldavDao caldavDao,
SubtasksHelper subtasksHelper) {
this.context = context;
this.preferences = preferences;
this.tagDataDao = tagDataDao;
this.taskListMetadataDao = taskListMetadataDao;
this.taskDao = taskDao;
this.gtasksListService = gtasksListService;
this.gtasksSyncService = gtasksSyncService;
this.googleTaskDao = googleTaskDao;
this.caldavDao = caldavDao;
this.subtasksHelper = subtasksHelper;
}
public TaskAdapter createTaskAdapter(Filter filter) {
if (filter instanceof TagFilter) {
TagFilter tagFilter = (TagFilter) filter;
TagData tagData = tagDataDao.getByUuid(tagFilter.getUuid());
if (tagData != null) {
return isManualSort() ? createManualTagTaskAdapter(tagFilter) : new TaskAdapter();
}
} else if (filter instanceof GtasksFilter) {
GtasksFilter gtasksFilter = (GtasksFilter) filter;
GoogleTaskList list = gtasksListService.getList(gtasksFilter.getStoreId());
if (list != null) {
return isManualSort()
? createManualGoogleTaskAdapter(gtasksFilter)
: new TaskAdapter();
}
} else if (filter instanceof CaldavFilter) {
CaldavFilter caldavFilter = (CaldavFilter) filter;
CaldavCalendar calendar = caldavDao.getCalendarByUuid(caldavFilter.getUuid());
if (calendar != null) {
return new TaskAdapter();
}
} else {
return subtasksHelper.shouldUseSubtasksFragmentForFilter(filter)
? createManualFilterTaskAdapter(filter)
: new TaskAdapter();
}
return new TaskAdapter();
}
private boolean isManualSort() {
return preferences.getBoolean(R.string.p_manual_sort, false);
}
private TaskAdapter createManualTagTaskAdapter(TagFilter filter) {
TagData tagData = filter.getTagData();
String tdId = tagData.getRemoteId();
TaskListMetadata list = taskListMetadataDao.fetchByTagOrFilter(tagData.getRemoteId());
if (list == null && !Task.isUuidEmpty(tdId)) {
list = new TaskListMetadata();
list.setTagUuid(tdId);
taskListMetadataDao.createNew(list);
}
SubtasksFilterUpdater updater = new SubtasksFilterUpdater(taskListMetadataDao, taskDao);
updater.initialize(list, filter);
return new AstridTaskAdapter(list, filter, updater, taskDao);
}
private TaskAdapter createManualGoogleTaskAdapter(GtasksFilter filter) {
GtasksTaskListUpdater updater = new GtasksTaskListUpdater(gtasksSyncService, googleTaskDao);
updater.initialize(filter);
return new GoogleTaskAdapter(filter.getList(), updater, taskDao, googleTaskDao);
}
private TaskAdapter createManualFilterTaskAdapter(Filter filter) {
String filterId = null;
String prefId = null;
if (BuiltInFilterExposer.isInbox(context, filter)) {
filterId = TaskListMetadata.FILTER_ID_ALL;
prefId = SubtasksFilterUpdater.ACTIVE_TASKS_ORDER;
} else if (BuiltInFilterExposer.isTodayFilter(context, filter)) {
filterId = TaskListMetadata.FILTER_ID_TODAY;
prefId = SubtasksFilterUpdater.TODAY_TASKS_ORDER;
}
if (TextUtils.isEmpty(filterId)) {
return null;
}
TaskListMetadata list = taskListMetadataDao.fetchByTagOrFilter(filterId);
if (list == null) {
String defaultOrder = preferences.getStringValue(prefId);
if (TextUtils.isEmpty(defaultOrder)) {
defaultOrder = "[]"; // $NON-NLS-1$
}
defaultOrder = SubtasksHelper.convertTreeToRemoteIds(taskDao, defaultOrder);
list = new TaskListMetadata();
list.setFilter(filterId);
list.setTaskIds(defaultOrder);
taskListMetadataDao.createNew(list);
}
SubtasksFilterUpdater updater = new SubtasksFilterUpdater(taskListMetadataDao, taskDao);
updater.initialize(list, filter);
return new AstridTaskAdapter(list, filter, updater, taskDao);
}
}

@ -68,6 +68,10 @@ public class CaldavFilter extends Filter {
return calendar.getUuid();
}
public CaldavCalendar getCalendar() {
return calendar;
}
/** {@inheritDoc} */
@Override
public void writeToParcel(Parcel dest, int flags) {
@ -83,6 +87,11 @@ public class CaldavFilter extends Filter {
@Override
public boolean supportsSubtasks() {
return true;
return false;
}
@Override
public int getMenu() {
return R.menu.menu_caldav_list_fragment;
}
}

@ -8,6 +8,7 @@ package com.todoroo.astrid.api;
import android.os.Parcel;
import android.os.Parcelable;
import androidx.annotation.MenuRes;
import com.todoroo.andlib.sql.QueryTemplate;
import java.util.Collections;
import java.util.HashMap;
@ -181,6 +182,10 @@ public class Filter extends FilterListItem {
return false;
}
public @MenuRes int getMenu() {
return 0;
}
@Override
public String toString() {
return "Filter{"

@ -77,6 +77,10 @@ public class GtasksFilter extends Filter {
return list.getId();
}
public GoogleTaskList getList() {
return list;
}
@Override
public boolean supportsSubtasks() {
return true;
@ -98,4 +102,9 @@ public class GtasksFilter extends Filter {
public String getRemoteId() {
return list.getRemoteId();
}
@Override
public int getMenu() {
return R.menu.menu_gtasks_list_fragment;
}
}

@ -36,7 +36,7 @@ public class TagFilter extends Filter {
};
private static final int TAG = R.drawable.ic_outline_label_24px;
private String uuid;
private TagData tagData;
private TagFilter() {
super();
@ -44,7 +44,7 @@ public class TagFilter extends Filter {
public TagFilter(TagData tagData) {
super(tagData.getName(), queryTemplate(tagData.getRemoteId()), getValuesForNewTask(tagData));
uuid = tagData.getRemoteId();
this.tagData = tagData;
tint = tagData.getColor();
icon = TAG;
}
@ -64,24 +64,33 @@ public class TagFilter extends Filter {
}
public String getUuid() {
return uuid;
return tagData.getRemoteId();
}
public TagData getTagData() {
return tagData;
}
/** {@inheritDoc} */
@Override
public void writeToParcel(Parcel dest, int flags) {
super.writeToParcel(dest, flags);
dest.writeString(uuid);
dest.writeParcelable(tagData, 0);
}
@Override
protected void readFromParcel(Parcel source) {
super.readFromParcel(source);
uuid = source.readString();
tagData = source.readParcelable(getClass().getClassLoader());
}
@Override
public boolean supportsSubtasks() {
return true;
}
@Override
public int getMenu() {
return R.menu.menu_tag_view_fragment;
}
}

@ -1,44 +0,0 @@
/*
* Copyright (c) 2012 Todoroo Inc
*
* See the file "LICENSE" for the full license governing this code.
*/
package com.todoroo.astrid.gtasks;
import com.todoroo.astrid.activity.TaskListFragment;
import com.todoroo.astrid.adapter.GoogleTaskAdapter;
import com.todoroo.astrid.adapter.TaskAdapter;
import com.todoroo.astrid.api.GtasksFilter;
import com.todoroo.astrid.dao.TaskDao;
import javax.inject.Inject;
import org.tasks.data.GoogleTaskDao;
import org.tasks.data.GoogleTaskList;
import org.tasks.injection.FragmentComponent;
import org.tasks.tasklist.GtasksListFragment;
public class GtasksSubtaskListFragment extends GtasksListFragment {
@Inject TaskDao taskDao;
@Inject GtasksTaskListUpdater updater;
@Inject GoogleTaskDao googleTaskDao;
public static TaskListFragment newGtasksSubtaskListFragment(
GtasksFilter filter, GoogleTaskList list) {
GtasksSubtaskListFragment fragment = new GtasksSubtaskListFragment();
fragment.filter = filter;
fragment.list = list;
return fragment;
}
@Override
protected TaskAdapter createTaskAdapter() {
updater.initialize(filter);
return new GoogleTaskAdapter(list, updater, taskDao, googleTaskDao);
}
@Override
public void inject(FragmentComponent component) {
component.inject(this);
}
}

@ -18,8 +18,8 @@ import timber.log.Timber;
public class SubtasksFilterUpdater {
static final String ACTIVE_TASKS_ORDER = "active_tasks_order"; // $NON-NLS-1$
static final String TODAY_TASKS_ORDER = "today_tasks_order"; // $NON-NLS-1$
public static final String ACTIVE_TASKS_ORDER = "active_tasks_order"; // $NON-NLS-1$
public static final String TODAY_TASKS_ORDER = "today_tasks_order"; // $NON-NLS-1$
private final TaskListMetadataDao taskListMetadataDao;
private final TaskDao taskDao;

@ -74,7 +74,7 @@ public class SubtasksHelper {
}
/** Takes a subtasks string containing local ids and remaps it to one containing UUIDs */
static String convertTreeToRemoteIds(TaskDao taskDao, String localTree) {
public static String convertTreeToRemoteIds(TaskDao taskDao, String localTree) {
List<Long> localIds = getIdList(localTree);
Map<Long, String> idMap = getIdMap(taskDao, localIds);
idMap.put(-1L, "-1"); // $NON-NLS-1$

@ -1,84 +0,0 @@
/*
* Copyright (c) 2012 Todoroo Inc
*
* See the file "LICENSE" for the full license governing this code.
*/
package com.todoroo.astrid.subtasks;
import android.app.Activity;
import android.content.Context;
import android.text.TextUtils;
import com.todoroo.astrid.activity.TaskListFragment;
import com.todoroo.astrid.adapter.AstridTaskAdapter;
import com.todoroo.astrid.adapter.TaskAdapter;
import com.todoroo.astrid.api.Filter;
import com.todoroo.astrid.core.BuiltInFilterExposer;
import com.todoroo.astrid.dao.TaskDao;
import com.todoroo.astrid.data.Task;
import javax.inject.Inject;
import org.tasks.data.TaskListMetadata;
import org.tasks.data.TaskListMetadataDao;
import org.tasks.injection.ForApplication;
import org.tasks.injection.FragmentComponent;
import org.tasks.preferences.Preferences;
/**
* Fragment for subtasks
*
* @author Tim Su <tim@astrid.com>
*/
public class SubtasksListFragment extends TaskListFragment {
@Inject Preferences preferences;
@Inject @ForApplication Context context;
@Inject TaskListMetadataDao taskListMetadataDao;
@Inject SubtasksFilterUpdater updater;
@Inject TaskDao taskDao;
public static TaskListFragment newSubtasksListFragment(Filter filter) {
SubtasksListFragment fragment = new SubtasksListFragment();
fragment.filter = filter;
return fragment;
}
@Override
protected TaskAdapter createTaskAdapter() {
TaskListMetadata list = initializeTaskListMetadata();
updater.initialize(list, filter);
return new AstridTaskAdapter(list, filter, updater, taskDao);
}
private TaskListMetadata initializeTaskListMetadata() {
String filterId = null;
String prefId = null;
if (BuiltInFilterExposer.isInbox(context, filter)) {
filterId = TaskListMetadata.FILTER_ID_ALL;
prefId = SubtasksFilterUpdater.ACTIVE_TASKS_ORDER;
} else if (BuiltInFilterExposer.isTodayFilter(context, filter)) {
filterId = TaskListMetadata.FILTER_ID_TODAY;
prefId = SubtasksFilterUpdater.TODAY_TASKS_ORDER;
}
if (TextUtils.isEmpty(filterId)) {
return null;
}
TaskListMetadata taskListMetadata = taskListMetadataDao.fetchByTagOrFilter(filterId);
if (taskListMetadata == null) {
String defaultOrder = preferences.getStringValue(prefId);
if (TextUtils.isEmpty(defaultOrder)) {
defaultOrder = "[]"; // $NON-NLS-1$
}
defaultOrder = SubtasksHelper.convertTreeToRemoteIds(taskDao, defaultOrder);
taskListMetadata = new TaskListMetadata();
taskListMetadata.setFilter(filterId);
taskListMetadata.setTaskIds(defaultOrder);
taskListMetadataDao.createNew(taskListMetadata);
}
return taskListMetadata;
}
@Override
public void inject(FragmentComponent component) {
component.inject(this);
}
}

@ -1,58 +0,0 @@
/*
* Copyright (c) 2012 Todoroo Inc
*
* See the file "LICENSE" for the full license governing this code.
*/
package com.todoroo.astrid.subtasks;
import com.todoroo.astrid.activity.TaskListFragment;
import com.todoroo.astrid.adapter.AstridTaskAdapter;
import com.todoroo.astrid.adapter.TaskAdapter;
import com.todoroo.astrid.api.TagFilter;
import com.todoroo.astrid.dao.TaskDao;
import com.todoroo.astrid.data.Task;
import javax.inject.Inject;
import org.tasks.data.TagData;
import org.tasks.data.TaskListMetadata;
import org.tasks.data.TaskListMetadataDao;
import org.tasks.injection.FragmentComponent;
import org.tasks.tasklist.TagListFragment;
public class SubtasksTagListFragment extends TagListFragment {
@Inject TaskListMetadataDao taskListMetadataDao;
@Inject SubtasksFilterUpdater updater;
@Inject TaskDao taskDao;
public static TaskListFragment newSubtasksTagListFragment(TagFilter filter, TagData tagData) {
SubtasksTagListFragment fragment = new SubtasksTagListFragment();
fragment.filter = filter;
fragment.tagData = tagData;
return fragment;
}
@Override
protected TaskAdapter createTaskAdapter() {
TaskListMetadata list = initializeTaskListMetadata();
updater.initialize(list, filter);
return new AstridTaskAdapter(list, filter, updater, taskDao);
}
private TaskListMetadata initializeTaskListMetadata() {
String tdId = tagData.getRemoteId();
TaskListMetadata taskListMetadata =
taskListMetadataDao.fetchByTagOrFilter(tagData.getRemoteId());
if (taskListMetadata == null && !Task.isUuidEmpty(tdId)) {
taskListMetadata = new TaskListMetadata();
taskListMetadata.setTagUuid(tdId);
taskListMetadataDao.createNew(taskListMetadata);
}
return taskListMetadata;
}
@Override
public void inject(FragmentComponent component) {
component.inject(this);
}
}

@ -1,96 +0,0 @@
package org.tasks.caldav;
import static android.app.Activity.RESULT_OK;
import android.content.Intent;
import android.os.Bundle;
import android.view.MenuItem;
import androidx.appcompat.widget.Toolbar;
import com.todoroo.astrid.activity.MainActivity;
import com.todoroo.astrid.activity.TaskListFragment;
import com.todoroo.astrid.api.CaldavFilter;
import com.todoroo.astrid.api.Filter;
import org.tasks.R;
import org.tasks.data.CaldavCalendar;
import org.tasks.injection.FragmentComponent;
public class CaldavListFragment extends TaskListFragment {
private static final String EXTRA_CALDAV_CALENDAR = "extra_caldav_calendar";
private static final int REQUEST_ACCOUNT_SETTINGS = 10101;
private CaldavCalendar calendar;
public static TaskListFragment newCaldavListFragment(
CaldavFilter filter, CaldavCalendar calendar) {
CaldavListFragment fragment = new CaldavListFragment();
fragment.filter = filter;
fragment.calendar = calendar;
return fragment;
}
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
if (savedInstanceState != null) {
this.calendar = savedInstanceState.getParcelable(EXTRA_CALDAV_CALENDAR);
}
}
@Override
protected void inflateMenu(Toolbar toolbar) {
super.inflateMenu(toolbar);
toolbar.inflateMenu(R.menu.menu_caldav_list_fragment);
}
@Override
public boolean onMenuItemClick(MenuItem item) {
switch (item.getItemId()) {
case R.id.menu_caldav_list_fragment:
Intent intent = new Intent(getActivity(), CaldavCalendarSettingsActivity.class);
intent.putExtra(EXTRA_CALDAV_CALENDAR, calendar);
startActivityForResult(intent, REQUEST_ACCOUNT_SETTINGS);
return true;
default:
return super.onMenuItemClick(item);
}
}
@Override
public void onActivityResult(int requestCode, int resultCode, Intent data) {
if (requestCode == REQUEST_ACCOUNT_SETTINGS) {
if (resultCode == RESULT_OK) {
MainActivity activity = (MainActivity) getActivity();
String action = data.getAction();
if (CaldavCalendarSettingsActivity.ACTION_DELETED.equals(action)) {
activity.onFilterItemClicked(null);
} else if (CaldavCalendarSettingsActivity.ACTION_RELOAD.equals(action)) {
activity
.getIntent()
.putExtra(
MainActivity.OPEN_FILTER,
(Filter) data.getParcelableExtra(MainActivity.OPEN_FILTER));
activity.recreate();
}
}
} else {
super.onActivityResult(requestCode, resultCode, data);
}
}
@Override
public void onSaveInstanceState(Bundle outState) {
super.onSaveInstanceState(outState);
outState.putParcelable(EXTRA_CALDAV_CALENDAR, calendar);
}
@Override
protected boolean hasDraggableOption() {
return false;
}
@Override
public void inject(FragmentComponent component) {
component.inject(this);
}
}

@ -3,20 +3,14 @@ package org.tasks.injection;
import com.todoroo.astrid.activity.TaskEditFragment;
import com.todoroo.astrid.activity.TaskListFragment;
import com.todoroo.astrid.files.FilesControlSet;
import com.todoroo.astrid.gtasks.GtasksSubtaskListFragment;
import com.todoroo.astrid.repeats.RepeatControlSet;
import com.todoroo.astrid.subtasks.SubtasksListFragment;
import com.todoroo.astrid.subtasks.SubtasksTagListFragment;
import com.todoroo.astrid.tags.TagsControlSet;
import com.todoroo.astrid.timers.TimerControlSet;
import com.todoroo.astrid.ui.EditTitleControlSet;
import com.todoroo.astrid.ui.HideUntilControlSet;
import com.todoroo.astrid.ui.ReminderControlSet;
import dagger.Subcomponent;
import org.tasks.caldav.CaldavListFragment;
import org.tasks.fragments.CommentBarFragment;
import org.tasks.tasklist.GtasksListFragment;
import org.tasks.tasklist.TagListFragment;
import org.tasks.ui.CalendarControlSet;
import org.tasks.ui.DeadlineControlSet;
import org.tasks.ui.DescriptionControlSet;
@ -58,19 +52,7 @@ public interface FragmentComponent {
void inject(TaskListFragment taskListFragment);
void inject(TagListFragment tagListFragment);
void inject(GtasksSubtaskListFragment gtasksSubtaskListFragment);
void inject(SubtasksListFragment subtasksListFragment);
void inject(SubtasksTagListFragment subtasksTagListFragment);
void inject(RemoteListFragment remoteListFragment);
void inject(GtasksListFragment gtasksListFragment);
void inject(CaldavListFragment caldavListFragment);
void inject(LocationControlSet locationControlSet);
}

@ -1,99 +0,0 @@
package org.tasks.tasklist;
import static android.app.Activity.RESULT_OK;
import android.content.Intent;
import android.os.Bundle;
import android.view.MenuItem;
import androidx.appcompat.widget.Toolbar;
import com.todoroo.astrid.activity.MainActivity;
import com.todoroo.astrid.activity.TaskListFragment;
import com.todoroo.astrid.api.Filter;
import com.todoroo.astrid.api.GtasksFilter;
import com.todoroo.astrid.gtasks.sync.GtasksSyncService;
import javax.inject.Inject;
import org.tasks.R;
import org.tasks.activities.GoogleTaskListSettingsActivity;
import org.tasks.data.GoogleTaskList;
import org.tasks.injection.FragmentComponent;
public class GtasksListFragment extends TaskListFragment {
private static final String EXTRA_STORE_OBJECT = "extra_store_object";
private static final int REQUEST_LIST_SETTINGS = 10101;
protected GoogleTaskList list;
@Inject GtasksSyncService gtasksSyncService;
public static TaskListFragment newGtasksListFragment(GtasksFilter filter, GoogleTaskList list) {
GtasksListFragment fragment = new GtasksListFragment();
fragment.filter = filter;
fragment.list = list;
return fragment;
}
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
if (savedInstanceState != null) {
list = savedInstanceState.getParcelable(EXTRA_STORE_OBJECT);
}
}
@Override
protected void inflateMenu(Toolbar toolbar) {
super.inflateMenu(toolbar);
toolbar.inflateMenu(R.menu.menu_gtasks_list_fragment);
}
@Override
public boolean onMenuItemClick(MenuItem item) {
switch (item.getItemId()) {
case R.id.menu_gtasks_list_settings:
Intent intent = new Intent(getActivity(), GoogleTaskListSettingsActivity.class);
intent.putExtra(GoogleTaskListSettingsActivity.EXTRA_STORE_DATA, list);
startActivityForResult(intent, REQUEST_LIST_SETTINGS);
return true;
default:
return super.onMenuItemClick(item);
}
}
@Override
public void onActivityResult(int requestCode, int resultCode, Intent data) {
if (requestCode == REQUEST_LIST_SETTINGS) {
if (resultCode == RESULT_OK) {
MainActivity activity = (MainActivity) getActivity();
String action = data.getAction();
if (GoogleTaskListSettingsActivity.ACTION_DELETED.equals(action)) {
activity.onFilterItemClicked(null);
} else if (GoogleTaskListSettingsActivity.ACTION_RELOAD.equals(action)) {
activity
.getIntent()
.putExtra(
MainActivity.OPEN_FILTER,
(Filter) data.getParcelableExtra(MainActivity.OPEN_FILTER));
activity.recreate();
}
}
} else {
super.onActivityResult(requestCode, resultCode, data);
}
}
@Override
public void onSaveInstanceState(Bundle outState) {
super.onSaveInstanceState(outState);
outState.putParcelable(EXTRA_STORE_OBJECT, list);
}
@Override
protected boolean hasDraggableOption() {
return list != null;
}
@Override
public void inject(FragmentComponent component) {
component.inject(this);
}
}

@ -1,96 +0,0 @@
package org.tasks.tasklist;
import android.app.Activity;
import android.content.Intent;
import android.os.Bundle;
import android.view.MenuItem;
import androidx.appcompat.widget.Toolbar;
import com.todoroo.astrid.activity.MainActivity;
import com.todoroo.astrid.activity.TaskListFragment;
import com.todoroo.astrid.api.Filter;
import com.todoroo.astrid.api.TagFilter;
import org.tasks.R;
import org.tasks.activities.TagSettingsActivity;
import org.tasks.data.TagData;
import org.tasks.injection.FragmentComponent;
public class TagListFragment extends TaskListFragment {
private static final int REQUEST_EDIT_TAG = 11543;
private static final String EXTRA_TAG_DATA = "extra_tag_data";
protected TagData tagData;
public static TaskListFragment newTagViewFragment(TagFilter filter, TagData tagData) {
TagListFragment fragment = new TagListFragment();
fragment.filter = filter;
fragment.tagData = tagData;
return fragment;
}
@Override
public void onCreate(Bundle savedInstanceState) {
if (savedInstanceState != null) {
tagData = savedInstanceState.getParcelable(EXTRA_TAG_DATA);
}
super.onCreate(savedInstanceState);
}
@Override
protected void inflateMenu(Toolbar toolbar) {
super.inflateMenu(toolbar);
toolbar.inflateMenu(R.menu.menu_tag_view_fragment);
}
@Override
public boolean onMenuItemClick(MenuItem item) {
switch (item.getItemId()) {
case R.id.menu_tag_settings:
Intent intent = new Intent(getActivity(), TagSettingsActivity.class);
intent.putExtra(TagSettingsActivity.EXTRA_TAG_DATA, tagData);
startActivityForResult(intent, REQUEST_EDIT_TAG);
return true;
default:
return super.onMenuItemClick(item);
}
}
@Override
public void onActivityResult(int requestCode, int resultCode, Intent data) {
if (requestCode == REQUEST_EDIT_TAG) {
if (resultCode == Activity.RESULT_OK) {
String action = data.getAction();
MainActivity activity = (MainActivity) getActivity();
if (TagSettingsActivity.ACTION_DELETED.equals(action)) {
activity.onFilterItemClicked(null);
} else if (TagSettingsActivity.ACTION_RELOAD.equals(action)) {
activity
.getIntent()
.putExtra(
MainActivity.OPEN_FILTER,
(Filter) data.getParcelableExtra(MainActivity.OPEN_FILTER));
activity.recreate();
}
}
} else {
super.onActivityResult(requestCode, resultCode, data);
}
}
@Override
public void onSaveInstanceState(Bundle outState) {
super.onSaveInstanceState(outState);
outState.putParcelable(EXTRA_TAG_DATA, tagData);
}
@Override
protected boolean hasDraggableOption() {
return tagData != null;
}
@Override
public void inject(FragmentComponent component) {
component.inject(this);
}
}

@ -46,6 +46,7 @@ public class TaskListViewModel extends ViewModel {
public LiveData<PagedList<Task>> getTasks(@NotNull Filter filter, Property<?>[] properties) {
if (tasks == null
|| !filter.equals(this.filter)
|| !filter.getSqlQuery().equals(this.filter.getSqlQuery())
|| !Arrays.equals(this.properties, properties)) {
this.filter = filter;
this.properties = properties;

Loading…
Cancel
Save