Move sync list pref, add 'don't sync'

pull/645/head
Alex Baker 8 years ago
parent c7a7d5267d
commit 6f36d6d430

@ -21,4 +21,8 @@ public class GtasksListService {
public GoogleTaskList getList(long storeId) { public GoogleTaskList getList(long storeId) {
return null; return null;
} }
public GoogleTaskList getList(String remoteId) {
return null;
}
} }

@ -1,6 +1,7 @@
package org.tasks.injection; package org.tasks.injection;
import org.tasks.activities.CalendarSelectionDialog; import org.tasks.activities.CalendarSelectionDialog;
import org.tasks.activities.RemoteListSupportPicker;
import org.tasks.dialogs.AddAttachmentDialog; import org.tasks.dialogs.AddAttachmentDialog;
import org.tasks.dialogs.ColorPickerDialog; import org.tasks.dialogs.ColorPickerDialog;
import org.tasks.dialogs.RecordAudioDialog; import org.tasks.dialogs.RecordAudioDialog;
@ -31,4 +32,6 @@ public interface DialogFragmentComponent {
void inject(RecordAudioDialog recordAudioDialog); void inject(RecordAudioDialog recordAudioDialog);
void inject(CustomRecurrenceDialog customRecurrenceDialog); void inject(CustomRecurrenceDialog customRecurrenceDialog);
void inject(RemoteListSupportPicker remoteListSupportPicker);
} }

@ -1,28 +0,0 @@
package org.tasks.injection;
import org.tasks.dialogs.DonationDialog;
import org.tasks.dialogs.ExportTasksDialog;
import org.tasks.dialogs.ImportTasksDialog;
import org.tasks.dialogs.NativeDatePickerDialog;
import org.tasks.dialogs.NativeTimePickerDialog;
import org.tasks.dialogs.SeekBarDialog;
import org.tasks.locale.LocalePickerDialog;
import dagger.Subcomponent;
@Subcomponent(modules = NativeDialogFragmentModule.class)
public interface NativeDialogFragmentComponent {
void inject(LocalePickerDialog localePickerDialog);
void inject(NativeDatePickerDialog nativeDatePickerDialog);
void inject(NativeTimePickerDialog nativeTimePickerDialog);
void inject(SeekBarDialog seekBarDialog);
void inject(ExportTasksDialog exportTasksDialog);
void inject(ImportTasksDialog importTasksDialog);
void inject(DonationDialog donationDialog);
}

@ -21,4 +21,8 @@ public class GtasksListService {
public GoogleTaskList getList(long storeId) { public GoogleTaskList getList(long storeId) {
return null; return null;
} }
public GoogleTaskList getList(String remoteId) {
return null;
}
} }

@ -1,6 +1,7 @@
package org.tasks.injection; package org.tasks.injection;
import org.tasks.activities.CalendarSelectionDialog; import org.tasks.activities.CalendarSelectionDialog;
import org.tasks.activities.RemoteListSupportPicker;
import org.tasks.dialogs.AddAttachmentDialog; import org.tasks.dialogs.AddAttachmentDialog;
import org.tasks.dialogs.ColorPickerDialog; import org.tasks.dialogs.ColorPickerDialog;
import org.tasks.dialogs.RecordAudioDialog; import org.tasks.dialogs.RecordAudioDialog;
@ -31,4 +32,6 @@ public interface DialogFragmentComponent {
void inject(RecordAudioDialog recordAudioDialog); void inject(RecordAudioDialog recordAudioDialog);
void inject(CustomRecurrenceDialog customRecurrenceDialog); void inject(CustomRecurrenceDialog customRecurrenceDialog);
void inject(RemoteListSupportPicker remoteListSupportPicker);
} }

@ -1,28 +0,0 @@
package org.tasks.injection;
import org.tasks.dialogs.DonationDialog;
import org.tasks.dialogs.ExportTasksDialog;
import org.tasks.dialogs.ImportTasksDialog;
import org.tasks.dialogs.NativeDatePickerDialog;
import org.tasks.dialogs.NativeTimePickerDialog;
import org.tasks.dialogs.SeekBarDialog;
import org.tasks.locale.LocalePickerDialog;
import dagger.Subcomponent;
@Subcomponent(modules = NativeDialogFragmentModule.class)
public interface NativeDialogFragmentComponent {
void inject(LocalePickerDialog localePickerDialog);
void inject(NativeDatePickerDialog nativeDatePickerDialog);
void inject(NativeTimePickerDialog nativeTimePickerDialog);
void inject(SeekBarDialog seekBarDialog);
void inject(ExportTasksDialog exportTasksDialog);
void inject(ImportTasksDialog importTasksDialog);
void inject(DonationDialog donationDialog);
}

@ -8,22 +8,17 @@ package com.todoroo.astrid.gtasks;
import android.content.Intent; import android.content.Intent;
import android.os.Bundle; import android.os.Bundle;
import android.preference.CheckBoxPreference; import android.preference.CheckBoxPreference;
import android.preference.Preference;
import android.support.annotation.NonNull; import android.support.annotation.NonNull;
import com.todoroo.andlib.utility.DateUtilities; import com.todoroo.andlib.utility.DateUtilities;
import com.todoroo.astrid.api.Filter;
import com.todoroo.astrid.api.GtasksFilter;
import com.todoroo.astrid.gtasks.auth.GtasksLoginActivity; import com.todoroo.astrid.gtasks.auth.GtasksLoginActivity;
import org.tasks.R; import org.tasks.R;
import org.tasks.analytics.Tracker; import org.tasks.analytics.Tracker;
import org.tasks.analytics.Tracking; import org.tasks.analytics.Tracking;
import org.tasks.data.GoogleTaskDao; import org.tasks.data.GoogleTaskDao;
import org.tasks.data.GoogleTaskList;
import org.tasks.dialogs.DialogBuilder; import org.tasks.dialogs.DialogBuilder;
import org.tasks.gtasks.PlayServicesAvailability; import org.tasks.gtasks.PlayServicesAvailability;
import org.tasks.gtasks.RemoteListSelectionHandler;
import org.tasks.gtasks.SyncAdapterHelper; import org.tasks.gtasks.SyncAdapterHelper;
import org.tasks.injection.ActivityComponent; import org.tasks.injection.ActivityComponent;
import org.tasks.injection.InjectingPreferenceActivity; import org.tasks.injection.InjectingPreferenceActivity;
@ -33,17 +28,13 @@ import org.tasks.preferences.PermissionRequestor;
import javax.inject.Inject; import javax.inject.Inject;
import static org.tasks.PermissionUtil.verifyPermissions; import static org.tasks.PermissionUtil.verifyPermissions;
import static org.tasks.activities.RemoteListNativePicker.newRemoteListNativePicker;
public class GtasksPreferences extends InjectingPreferenceActivity implements RemoteListSelectionHandler { public class GtasksPreferences extends InjectingPreferenceActivity {
private static final String FRAG_TAG_GOOGLE_TASK_LIST_SELECTION = "frag_tag_google_task_list_selection";
private static final int REQUEST_LOGIN = 0; private static final int REQUEST_LOGIN = 0;
@Inject GtasksPreferenceService gtasksPreferenceService; @Inject GtasksPreferenceService gtasksPreferenceService;
@Inject ActivityPermissionRequestor permissionRequestor; @Inject ActivityPermissionRequestor permissionRequestor;
@Inject GtasksListService gtasksListService;
@Inject Tracker tracker; @Inject Tracker tracker;
@Inject SyncAdapterHelper syncAdapterHelper; @Inject SyncAdapterHelper syncAdapterHelper;
@Inject PlayServicesAvailability playServicesAvailability; @Inject PlayServicesAvailability playServicesAvailability;
@ -96,20 +87,6 @@ public class GtasksPreferences extends InjectingPreferenceActivity implements Re
.show(); .show();
return true; return true;
}); });
Preference defaultListPreference = findPreference(R.string.p_gtasks_default_list);
defaultListPreference.setOnPreferenceClickListener(preference -> {
newRemoteListNativePicker(new GtasksFilter(getDefaultList()))
.show(getFragmentManager(), FRAG_TAG_GOOGLE_TASK_LIST_SELECTION);
return false;
});
GoogleTaskList defaultList = getDefaultList();
if (defaultList != null) {
defaultListPreference.setSummary(defaultList.getTitle());
}
}
private GoogleTaskList getDefaultList() {
return gtasksListService.getList(gtasksPreferenceService.getDefaultList());
} }
private void requestLogin() { private void requestLogin() {
@ -158,16 +135,4 @@ public class GtasksPreferences extends InjectingPreferenceActivity implements Re
public void inject(ActivityComponent component) { public void inject(ActivityComponent component) {
component.inject(this); component.inject(this);
} }
@Override
public void selectedList(Filter list) {
if (list instanceof GtasksFilter) {
tracker.reportEvent(Tracking.Events.GTASK_DEFAULT_LIST);
String listId = ((GtasksFilter) list).getRemoteId();
gtasksPreferenceService.setDefaultList(listId);
} else {
throw new RuntimeException("Unhandled filter type");
}
findPreference(R.string.p_gtasks_default_list).setSummary(list.listingTitle);
}
} }

@ -32,6 +32,8 @@ import com.google.api.services.tasks.model.TaskLists;
import com.google.api.services.tasks.model.Tasks; import com.google.api.services.tasks.model.Tasks;
import com.google.common.base.Strings; import com.google.common.base.Strings;
import com.todoroo.andlib.utility.DateUtilities; import com.todoroo.andlib.utility.DateUtilities;
import com.todoroo.astrid.api.Filter;
import com.todoroo.astrid.api.GtasksFilter;
import com.todoroo.astrid.dao.TaskDao; import com.todoroo.astrid.dao.TaskDao;
import com.todoroo.astrid.data.SyncFlags; import com.todoroo.astrid.data.SyncFlags;
import com.todoroo.astrid.data.Task; import com.todoroo.astrid.data.Task;
@ -56,6 +58,7 @@ import org.tasks.data.GoogleTaskListDao;
import org.tasks.injection.InjectingAbstractThreadedSyncAdapter; import org.tasks.injection.InjectingAbstractThreadedSyncAdapter;
import org.tasks.injection.SyncAdapterComponent; import org.tasks.injection.SyncAdapterComponent;
import org.tasks.notifications.NotificationManager; import org.tasks.notifications.NotificationManager;
import org.tasks.preferences.DefaultFilterProvider;
import org.tasks.preferences.Preferences; import org.tasks.preferences.Preferences;
import org.tasks.sync.RecordSyncStatusCallback; import org.tasks.sync.RecordSyncStatusCallback;
import org.tasks.time.DateTime; import org.tasks.time.DateTime;
@ -96,6 +99,7 @@ public class GoogleTaskSyncAdapter extends InjectingAbstractThreadedSyncAdapter
@Inject NotificationManager notificationManager; @Inject NotificationManager notificationManager;
@Inject GoogleTaskDao googleTaskDao; @Inject GoogleTaskDao googleTaskDao;
@Inject TaskCreator taskCreator; @Inject TaskCreator taskCreator;
@Inject DefaultFilterProvider defaultFilterProvider;
public GoogleTaskSyncAdapter(Context context, boolean autoInitialize) { public GoogleTaskSyncAdapter(Context context, boolean autoInitialize) {
super(context, autoInitialize); super(context, autoInitialize);
@ -174,8 +178,12 @@ public class GoogleTaskSyncAdapter extends InjectingAbstractThreadedSyncAdapter
nextPageToken = remoteLists.getNextPageToken(); nextPageToken = remoteLists.getNextPageToken();
} while (nextPageToken != null); } while (nextPageToken != null);
gtasksListService.updateLists(gtaskLists); gtasksListService.updateLists(gtaskLists);
if (gtasksListService.getList(gtasksPreferenceService.getDefaultList()) == null) { Filter defaultRemoteList = defaultFilterProvider.getDefaultRemoteList();
gtasksPreferenceService.setDefaultList(null); if (defaultRemoteList instanceof GtasksFilter) {
GoogleTaskList list = gtasksListService.getList(((GtasksFilter) defaultRemoteList).getRemoteId());
if (list == null) {
preferences.setString(R.string.p_default_remote_list, null);
}
} }
for (final GoogleTaskList list : gtasksListService.getListsToUpdate(gtaskLists)) { for (final GoogleTaskList list : gtasksListService.getListsToUpdate(gtaskLists)) {
fetchAndApplyRemoteChanges(list); fetchAndApplyRemoteChanges(list);
@ -205,25 +213,21 @@ public class GoogleTaskSyncAdapter extends InjectingAbstractThreadedSyncAdapter
} }
GoogleTask gtasksMetadata = googleTaskDao.getByTaskId(task.getId()); GoogleTask gtasksMetadata = googleTaskDao.getByTaskId(task.getId());
if (gtasksMetadata == null) {
return;
}
com.google.api.services.tasks.model.Task remoteModel; com.google.api.services.tasks.model.Task remoteModel;
boolean newlyCreated = false; boolean newlyCreated = false;
String remoteId; String remoteId;
String listId = gtasksPreferenceService.getDefaultList(); Filter defaultRemoteList = defaultFilterProvider.getDefaultRemoteList();
if (listId == null) { String listId = defaultRemoteList instanceof GtasksFilter
com.google.api.services.tasks.model.TaskList defaultList = invoker.getGtaskList(DEFAULT_LIST); ? ((GtasksFilter) defaultRemoteList).getRemoteId()
if (defaultList != null) { : DEFAULT_LIST;
listId = defaultList.getId();
gtasksPreferenceService.setDefaultList(listId);
} else {
listId = DEFAULT_LIST;
}
}
if (gtasksMetadata == null || Strings.isNullOrEmpty(gtasksMetadata.getRemoteId())) { //Create case if (Strings.isNullOrEmpty(gtasksMetadata.getRemoteId())) { //Create case
if (gtasksMetadata == null) {
gtasksMetadata = new GoogleTask(task.getId(), listId);
}
String selectedList = gtasksMetadata.getListId(); String selectedList = gtasksMetadata.getListId();
if (!Strings.isNullOrEmpty(selectedList)) { if (!Strings.isNullOrEmpty(selectedList)) {
listId = selectedList; listId = selectedList;

@ -12,14 +12,15 @@ import com.todoroo.astrid.api.GtasksFilter;
import com.todoroo.astrid.data.SyncFlags; import com.todoroo.astrid.data.SyncFlags;
import com.todoroo.astrid.data.Task; import com.todoroo.astrid.data.Task;
import com.todoroo.astrid.gtasks.GtasksListService; import com.todoroo.astrid.gtasks.GtasksListService;
import com.todoroo.astrid.gtasks.GtasksPreferenceService;
import org.tasks.R; import org.tasks.R;
import org.tasks.analytics.Tracker; import org.tasks.analytics.Tracker;
import org.tasks.analytics.Tracking; import org.tasks.analytics.Tracking;
import org.tasks.data.GoogleTask; import org.tasks.data.GoogleTask;
import org.tasks.data.GoogleTaskDao; import org.tasks.data.GoogleTaskDao;
import org.tasks.data.GoogleTaskList;
import org.tasks.injection.FragmentComponent; import org.tasks.injection.FragmentComponent;
import org.tasks.preferences.DefaultFilterProvider;
import javax.inject.Inject; import javax.inject.Inject;
@ -39,10 +40,10 @@ public class RemoteListFragment extends TaskEditControlFragment {
@BindView(R.id.google_task_list) TextView textView; @BindView(R.id.google_task_list) TextView textView;
@Inject GtasksPreferenceService gtasksPreferenceService;
@Inject GtasksListService gtasksListService; @Inject GtasksListService gtasksListService;
@Inject GoogleTaskDao googleTaskDao; @Inject GoogleTaskDao googleTaskDao;
@Inject Tracker tracker; @Inject Tracker tracker;
@Inject DefaultFilterProvider defaultFilterProvider;
@Nullable private Filter originalList; @Nullable private Filter originalList;
@Nullable private Filter selectedList; @Nullable private Filter selectedList;
@ -56,16 +57,15 @@ public class RemoteListFragment extends TaskEditControlFragment {
selectedList = savedInstanceState.getParcelable(EXTRA_SELECTED_LIST); selectedList = savedInstanceState.getParcelable(EXTRA_SELECTED_LIST);
} else { } else {
if (task.isNew()) { if (task.isNew()) {
originalList = new GtasksFilter(gtasksListService.getList(task.getTransitory(GoogleTask.KEY))); originalList = task.hasTransitory(GoogleTask.KEY)
? new GtasksFilter(gtasksListService.getList(task.getTransitory(GoogleTask.KEY)))
: defaultFilterProvider.getDefaultRemoteList();
} else { } else {
GoogleTask googleTask = googleTaskDao.getByTaskId(task.getId()); GoogleTask googleTask = googleTaskDao.getByTaskId(task.getId());
if (googleTask != null) { if (googleTask != null) {
originalList = new GtasksFilter(gtasksListService.getList(googleTask.getListId())); originalList = new GtasksFilter(gtasksListService.getList(googleTask.getListId()));
} }
} }
if (originalList == null) {
originalList = new GtasksFilter(gtasksListService.getList(gtasksPreferenceService.getDefaultList()));
}
selectedList = originalList; selectedList = originalList;
} }
@ -87,7 +87,7 @@ public class RemoteListFragment extends TaskEditControlFragment {
@Override @Override
protected int getLayout() { protected int getLayout() {
return R.layout.control_set_google_task_list; return R.layout.control_set_remote_list;
} }
@Override @Override
@ -108,25 +108,26 @@ public class RemoteListFragment extends TaskEditControlFragment {
@Override @Override
public void apply(Task task) { public void apply(Task task) {
if (selectedList == null) { GoogleTask googleTask = googleTaskDao.getByTaskId(task.getId());
if (googleTask != null && selectedList != null && googleTask.getListId().equals(((GtasksFilter) selectedList).getRemoteId())) {
return; return;
} }
GoogleTask googleTask = googleTaskDao.getByTaskId(task.getId()); if (googleTask != null) {
if (googleTask == null) {
googleTaskDao.insert(new GoogleTask(task.getId(), ((GtasksFilter) selectedList).getRemoteId()));
} else if (!googleTask.getListId().equals(((GtasksFilter) selectedList).getRemoteId())) {
tracker.reportEvent(Tracking.Events.GTASK_MOVE); tracker.reportEvent(Tracking.Events.GTASK_MOVE);
task.putTransitory(SyncFlags.FORCE_SYNC, true); task.putTransitory(SyncFlags.FORCE_SYNC, true);
googleTask.setDeleted(now()); googleTask.setDeleted(now());
googleTaskDao.update(googleTask); googleTaskDao.update(googleTask);
}
if (selectedList != null) {
googleTaskDao.insert(new GoogleTask(task.getId(), ((GtasksFilter) selectedList).getRemoteId())); googleTaskDao.insert(new GoogleTask(task.getId(), ((GtasksFilter) selectedList).getRemoteId()));
} }
} }
@Override @Override
public boolean hasChanges(Task original) { public boolean hasChanges(Task original) {
return selectedList != null && !selectedList.equals(originalList); return selectedList == null ? originalList != null : !selectedList.equals(originalList);
} }
@Override @Override
@ -135,7 +136,9 @@ public class RemoteListFragment extends TaskEditControlFragment {
} }
public void setList(Filter list) { public void setList(Filter list) {
if (list instanceof GtasksFilter) { if (list == null) {
this.selectedList = null;
} else if (list instanceof GtasksFilter) {
this.selectedList = list; this.selectedList = list;
} else { } else {
throw new RuntimeException("Unhandled filter type"); throw new RuntimeException("Unhandled filter type");
@ -144,8 +147,6 @@ public class RemoteListFragment extends TaskEditControlFragment {
} }
private void refreshView() { private void refreshView() {
if (selectedList != null) { textView.setText(selectedList == null ? null : selectedList.listingTitle);
textView.setText(selectedList.listingTitle);
}
} }
} }

@ -260,9 +260,15 @@ public class FilterAdapter extends ArrayAdapter<FilterListItem> {
public void populateRemoteListPicker() { public void populateRemoteListPicker() {
clear(); clear();
for (Filter filter : filterProvider.getGoogleTaskFilters()) { Filter item = new Filter(activity.getString(R.string.dont_sync), null);
add(filter); item.icon = R.drawable.ic_cloud_off_black_24dp;
add(item);
String title = preferences.getStringValue(GtasksPreferenceService.PREF_USER_NAME);
if (Strings.isNullOrEmpty(title)) {
title = activity.getResources().getString(R.string.gtasks_GPr_header);
} }
addSubMenu(title, filterProvider.getGoogleTaskFilters(), true);
notifyDataSetChanged(); notifyDataSetChanged();
} }

@ -10,27 +10,44 @@ import android.os.Bundle;
import android.preference.Preference; import android.preference.Preference;
import android.support.annotation.NonNull; import android.support.annotation.NonNull;
import com.todoroo.astrid.api.Filter;
import com.todoroo.astrid.api.GtasksFilter;
import com.todoroo.astrid.gtasks.GtasksPreferenceService;
import org.tasks.R; import org.tasks.R;
import org.tasks.activities.CalendarSelectionActivity; import org.tasks.activities.CalendarSelectionActivity;
import org.tasks.analytics.Tracker;
import org.tasks.analytics.Tracking;
import org.tasks.calendars.AndroidCalendar; import org.tasks.calendars.AndroidCalendar;
import org.tasks.calendars.CalendarProvider; import org.tasks.calendars.CalendarProvider;
import org.tasks.gtasks.RemoteListSelectionHandler;
import org.tasks.gtasks.SyncAdapterHelper;
import org.tasks.injection.ActivityComponent; import org.tasks.injection.ActivityComponent;
import org.tasks.injection.InjectingPreferenceActivity; import org.tasks.injection.InjectingPreferenceActivity;
import org.tasks.preferences.ActivityPermissionRequestor; import org.tasks.preferences.ActivityPermissionRequestor;
import org.tasks.preferences.DefaultFilterProvider;
import org.tasks.preferences.PermissionRequestor; import org.tasks.preferences.PermissionRequestor;
import org.tasks.preferences.Preferences; import org.tasks.preferences.Preferences;
import javax.inject.Inject; import javax.inject.Inject;
import static org.tasks.PermissionUtil.verifyPermissions; import static org.tasks.PermissionUtil.verifyPermissions;
import static org.tasks.activities.RemoteListNativePicker.newRemoteListNativePicker;
public class DefaultsPreferences extends InjectingPreferenceActivity implements RemoteListSelectionHandler {
public class DefaultsPreferences extends InjectingPreferenceActivity { private static final String FRAG_TAG_REMOTE_LIST_SELECTION = "frag_tag_remote_list_selection";
private static final int REQUEST_CALENDAR_SELECTION = 10412; private static final int REQUEST_CALENDAR_SELECTION = 10412;
@Inject Preferences preferences; @Inject Preferences preferences;
@Inject CalendarProvider calendarProvider; @Inject CalendarProvider calendarProvider;
@Inject ActivityPermissionRequestor permissionRequester; @Inject ActivityPermissionRequestor permissionRequester;
@Inject Tracker tracker;
@Inject GtasksPreferenceService gtasksPreferenceService;
@Inject SyncAdapterHelper syncAdapterHelper;
@Inject DefaultFilterProvider defaultFilterProvider;
private Preference defaultCalendarPref; private Preference defaultCalendarPref;
@Override @Override
@ -50,6 +67,17 @@ public class DefaultsPreferences extends InjectingPreferenceActivity {
defaultCalendarPref.setSummary(defaultCalendarName == null defaultCalendarPref.setSummary(defaultCalendarName == null
? getString(R.string.dont_add_to_calendar) ? getString(R.string.dont_add_to_calendar)
: defaultCalendarName); : defaultCalendarName);
if (syncAdapterHelper.isEnabled()) {
findPreference(R.string.p_default_remote_list).setOnPreferenceClickListener(preference -> {
newRemoteListNativePicker(defaultFilterProvider.getDefaultRemoteList())
.show(getFragmentManager(), FRAG_TAG_REMOTE_LIST_SELECTION);
return false;
});
updateRemoteListSummary();
} else {
remove(R.string.p_default_remote_list);
}
} }
private void startCalendarSelectionActivity() { private void startCalendarSelectionActivity() {
@ -86,6 +114,26 @@ public class DefaultsPreferences extends InjectingPreferenceActivity {
} }
} }
@Override
public void selectedList(Filter list) {
tracker.reportEvent(Tracking.Events.DEFAULT_REMOTE_LIST);
if (list == null) {
preferences.setString(R.string.p_default_remote_list, null);
} else if (list instanceof GtasksFilter) {
defaultFilterProvider.setDefaultFilter(list);
} else {
throw new RuntimeException("Unhandled filter type");
}
updateRemoteListSummary();
}
private void updateRemoteListSummary() {
Filter defaultFilter = defaultFilterProvider.getDefaultRemoteList();
findPreference(R.string.p_default_remote_list).setSummary(defaultFilter == null
? getString(R.string.dont_sync)
: defaultFilter.listingTitle);
}
@Override @Override
public void inject(ActivityComponent component) { public void inject(ActivityComponent component) {
component.inject(this); component.inject(this);

@ -96,8 +96,7 @@ public abstract class TaskDao {
@android.arch.persistence.room.Query("SELECT tasks.* FROM tasks " + @android.arch.persistence.room.Query("SELECT tasks.* FROM tasks " +
"LEFT JOIN google_tasks ON tasks._id = google_tasks.task " + "LEFT JOIN google_tasks ON tasks._id = google_tasks.task " +
"WHERE tasks.modified > google_tasks.last_sync " + "WHERE tasks.modified > google_tasks.last_sync " +
"OR google_tasks.remote_id = '' " + "OR google_tasks.remote_id = ''")
"OR google_tasks.remote_id IS NULL")
public abstract List<Task> getTasksToPush(); public abstract List<Task> getTasksToPush();
@android.arch.persistence.room.Query("SELECT * FROM TASKS " + @android.arch.persistence.room.Query("SELECT * FROM TASKS " +

@ -949,6 +949,10 @@ public class Task implements Parcelable {
return tags == null ? new ArrayList<>() : (ArrayList<String>) tags; return tags == null ? new ArrayList<>() : (ArrayList<String>) tags;
} }
public boolean hasTransitory(String key) {
return transitoryData != null && transitoryData.containsKey(key);
}
public <T> T getTransitory(String key) { public <T> T getTransitory(String key) {
if(transitoryData == null) { if(transitoryData == null) {
return null; return null;

@ -23,7 +23,6 @@ public class GtasksPreferenceService {
private static final String IDENTIFIER = "gtasks"; //$NON-NLS-1$ private static final String IDENTIFIER = "gtasks"; //$NON-NLS-1$
private static final String PREF_DEFAULT_LIST = IDENTIFIER + "_defaultlist"; //$NON-NLS-1$
public static final String PREF_USER_NAME = IDENTIFIER + "_user"; //$NON-NLS-1$ public static final String PREF_USER_NAME = IDENTIFIER + "_user"; //$NON-NLS-1$
@Inject @Inject
@ -31,14 +30,6 @@ public class GtasksPreferenceService {
this.preferences = preferences; this.preferences = preferences;
} }
public String getDefaultList() {
return preferences.getStringValue(PREF_DEFAULT_LIST);
}
public void setDefaultList(String defaultList) {
preferences.setString(PREF_DEFAULT_LIST, defaultList);
}
public String getUserName() { public String getUserName() {
return preferences.getStringValue(PREF_USER_NAME); return preferences.getStringValue(PREF_USER_NAME);
} }

@ -9,10 +9,12 @@ import android.content.Context;
import android.database.sqlite.SQLiteException; import android.database.sqlite.SQLiteException;
import android.os.Environment; import android.os.Environment;
import com.google.common.base.Strings;
import com.google.common.collect.ImmutableList; import com.google.common.collect.ImmutableList;
import com.google.common.collect.ImmutableListMultimap; import com.google.common.collect.ImmutableListMultimap;
import com.google.common.collect.ListMultimap; import com.google.common.collect.ListMultimap;
import com.google.common.collect.Multimaps; import com.google.common.collect.Multimaps;
import com.todoroo.astrid.api.GtasksFilter;
import com.todoroo.astrid.dao.Database; import com.todoroo.astrid.dao.Database;
import com.todoroo.astrid.tags.TagService; import com.todoroo.astrid.tags.TagService;
@ -23,11 +25,14 @@ import org.tasks.analytics.Tracker;
import org.tasks.analytics.Tracking; import org.tasks.analytics.Tracking;
import org.tasks.data.Filter; import org.tasks.data.Filter;
import org.tasks.data.FilterDao; import org.tasks.data.FilterDao;
import org.tasks.data.GoogleTaskList;
import org.tasks.data.GoogleTaskListDao;
import org.tasks.data.Tag; import org.tasks.data.Tag;
import org.tasks.data.TagDao; import org.tasks.data.TagDao;
import org.tasks.data.TagData; import org.tasks.data.TagData;
import org.tasks.data.TagDataDao; import org.tasks.data.TagDataDao;
import org.tasks.injection.ForApplication; import org.tasks.injection.ForApplication;
import org.tasks.preferences.DefaultFilterProvider;
import org.tasks.preferences.Preferences; import org.tasks.preferences.Preferences;
import org.tasks.scheduling.BackgroundScheduler; import org.tasks.scheduling.BackgroundScheduler;
@ -43,6 +48,7 @@ public class StartupService {
private static final int V4_8_0 = 380; private static final int V4_8_0 = 380;
private static final int V4_9_5 = 434; private static final int V4_9_5 = 434;
private static final int V5_3_0 = 491; private static final int V5_3_0 = 491;
private static final int V5_3_1 = 501;
private final Database database; private final Database database;
private final Preferences preferences; private final Preferences preferences;
@ -53,12 +59,16 @@ public class StartupService {
private final Context context; private final Context context;
private final TagDao tagDao; private final TagDao tagDao;
private final FilterDao filterDao; private final FilterDao filterDao;
private final DefaultFilterProvider defaultFilterProvider;
private final GoogleTaskListDao googleTaskListDao;
@Inject @Inject
public StartupService(Database database, Preferences preferences, Tracker tracker, public StartupService(Database database, Preferences preferences, Tracker tracker,
TagDataDao tagDataDao, TagService tagService, TagDataDao tagDataDao, TagService tagService,
LocalBroadcastManager localBroadcastManager, LocalBroadcastManager localBroadcastManager,
@ForApplication Context context, TagDao tagDao, FilterDao filterDao) { @ForApplication Context context, TagDao tagDao,
FilterDao filterDao, DefaultFilterProvider defaultFilterProvider,
GoogleTaskListDao googleTaskListDao) {
this.database = database; this.database = database;
this.preferences = preferences; this.preferences = preferences;
this.tracker = tracker; this.tracker = tracker;
@ -68,6 +78,8 @@ public class StartupService {
this.context = context; this.context = context;
this.tagDao = tagDao; this.tagDao = tagDao;
this.filterDao = filterDao; this.filterDao = filterDao;
this.defaultFilterProvider = defaultFilterProvider;
this.googleTaskListDao = googleTaskListDao;
} }
/** Called when this application is started up */ /** Called when this application is started up */
@ -106,6 +118,9 @@ public class StartupService {
if (from < V5_3_0) { if (from < V5_3_0) {
migrateFilters(); migrateFilters();
} }
if (from < V5_3_1) {
migrateDefaultSyncList();
}
tracker.reportEvent(Tracking.Events.UPGRADE, Integer.toString(from)); tracker.reportEvent(Tracking.Events.UPGRADE, Integer.toString(from));
} }
preferences.setCurrentVersion(to); preferences.setCurrentVersion(to);
@ -149,6 +164,16 @@ public class StartupService {
} }
} }
private void migrateDefaultSyncList() {
String defaultGoogleTaskList = preferences.getStringValue("gtasks_defaultlist");
if (!Strings.isNullOrEmpty(defaultGoogleTaskList)) {
GoogleTaskList googleTaskList = googleTaskListDao.getByRemoteId(defaultGoogleTaskList);
if (googleTaskList != null) {
defaultFilterProvider.setDefaultRemoteList(new GtasksFilter(googleTaskList));
}
}
}
private String migrate(String input) { private String migrate(String input) {
return input return input
.replaceAll("SELECT metadata\\.task AS task FROM metadata INNER JOIN tasks ON \\(\\(metadata\\.task=tasks\\._id\\)\\) WHERE \\(\\(\\(tasks\\.completed=0\\) AND \\(tasks\\.deleted=0\\) AND \\(tasks\\.hideUntil<\\(strftime\\(\\'%s\\',\\'now\\'\\)\\*1000\\)\\)\\) AND \\(metadata\\.key=\\'tags-tag\\'\\) AND \\(metadata\\.value", .replaceAll("SELECT metadata\\.task AS task FROM metadata INNER JOIN tasks ON \\(\\(metadata\\.task=tasks\\._id\\)\\) WHERE \\(\\(\\(tasks\\.completed=0\\) AND \\(tasks\\.deleted=0\\) AND \\(tasks\\.hideUntil<\\(strftime\\(\\'%s\\',\\'now\\'\\)\\*1000\\)\\)\\) AND \\(metadata\\.key=\\'tags-tag\\'\\) AND \\(metadata\\.value",

@ -6,6 +6,8 @@ import android.text.TextUtils;
import com.google.common.base.Strings; import com.google.common.base.Strings;
import com.todoroo.andlib.utility.DateUtilities; import com.todoroo.andlib.utility.DateUtilities;
import com.todoroo.astrid.api.Filter;
import com.todoroo.astrid.api.GtasksFilter;
import com.todoroo.astrid.api.PermaSql; import com.todoroo.astrid.api.PermaSql;
import com.todoroo.astrid.dao.TaskDao; import com.todoroo.astrid.dao.TaskDao;
import com.todoroo.astrid.data.Task; import com.todoroo.astrid.data.Task;
@ -23,6 +25,7 @@ import org.tasks.data.Tag;
import org.tasks.data.TagDao; import org.tasks.data.TagDao;
import org.tasks.data.TagData; import org.tasks.data.TagData;
import org.tasks.data.TagDataDao; import org.tasks.data.TagDataDao;
import org.tasks.preferences.DefaultFilterProvider;
import org.tasks.preferences.Preferences; import org.tasks.preferences.Preferences;
import java.util.ArrayList; import java.util.ArrayList;
@ -41,6 +44,7 @@ public class TaskCreator {
private final TagDao tagDao; private final TagDao tagDao;
private final GoogleTaskDao googleTaskDao; private final GoogleTaskDao googleTaskDao;
private final Tracker tracker; private final Tracker tracker;
private final DefaultFilterProvider defaultFilterProvider;
private final TagDataDao tagDataDao; private final TagDataDao tagDataDao;
private final TaskDao taskDao; private final TaskDao taskDao;
private final TagService tagService; private final TagService tagService;
@ -48,7 +52,7 @@ public class TaskCreator {
@Inject @Inject
public TaskCreator(GCalHelper gcalHelper, Preferences preferences, TagDataDao tagDataDao, public TaskCreator(GCalHelper gcalHelper, Preferences preferences, TagDataDao tagDataDao,
TaskDao taskDao, TagService tagService, TagDao tagDao, TaskDao taskDao, TagService tagService, TagDao tagDao,
GoogleTaskDao googleTaskDao, Tracker tracker) { GoogleTaskDao googleTaskDao, Tracker tracker, DefaultFilterProvider defaultFilterProvider) {
this.gcalHelper = gcalHelper; this.gcalHelper = gcalHelper;
this.preferences = preferences; this.preferences = preferences;
this.tagDataDao = tagDataDao; this.tagDataDao = tagDataDao;
@ -57,6 +61,7 @@ public class TaskCreator {
this.tagDao = tagDao; this.tagDao = tagDao;
this.googleTaskDao = googleTaskDao; this.googleTaskDao = googleTaskDao;
this.tracker = tracker; this.tracker = tracker;
this.defaultFilterProvider = defaultFilterProvider;
} }
public Task basicQuickAddTask(String title) { public Task basicQuickAddTask(String title) {
@ -73,9 +78,13 @@ public class TaskCreator {
createTags(task); createTags(task);
String googleTaskList = task.getTransitory(GoogleTask.KEY); if (task.hasTransitory(GoogleTask.KEY)) {
if (!Strings.isNullOrEmpty(googleTaskList)) { googleTaskDao.insert(new GoogleTask(task.getId(), task.getTransitory(GoogleTask.KEY)));
googleTaskDao.insert(new GoogleTask(task.getId(), googleTaskList)); } else {
Filter remoteList = defaultFilterProvider.getDefaultRemoteList();
if (remoteList != null && remoteList instanceof GtasksFilter) {
googleTaskDao.insert(new GoogleTask(task.getId(), ((GtasksFilter) remoteList).getRemoteId()));
}
} }
taskDao.save(task, null); taskDao.save(task, null);

@ -55,12 +55,16 @@ public class RemoteListSupportPicker extends InjectingDialogFragment {
public static AlertDialog createDialog(FilterAdapter filterAdapter, DialogBuilder dialogBuilder, public static AlertDialog createDialog(FilterAdapter filterAdapter, DialogBuilder dialogBuilder,
Filter selected, RemoteListSelectionHandler handler) { Filter selected, RemoteListSelectionHandler handler) {
filterAdapter.populateRemoteListPicker(); filterAdapter.populateRemoteListPicker();
int selectedIndex = filterAdapter.indexOf(selected); int selectedIndex = selected == null ? 0 : filterAdapter.indexOf(selected);
return dialogBuilder.newDialog() return dialogBuilder.newDialog()
.setSingleChoiceItems(filterAdapter, selectedIndex, (dialog, which) -> { .setSingleChoiceItems(filterAdapter, selectedIndex, (dialog, which) -> {
FilterListItem item = filterAdapter.getItem(which); if (which == 0) {
if (item instanceof GtasksFilter) { handler.selectedList(null);
handler.selectedList((GtasksFilter) item); } else {
FilterListItem item = filterAdapter.getItem(which);
if (item instanceof GtasksFilter) {
handler.selectedList((GtasksFilter) item);
}
} }
dialog.dismiss(); dialog.dismiss();
}) })

@ -7,7 +7,7 @@ public class Tracking {
public enum Events { public enum Events {
SET_DEFAULT_LIST(R.string.tracking_category_preferences, R.string.p_default_list), SET_DEFAULT_LIST(R.string.tracking_category_preferences, R.string.p_default_list),
SET_BADGE_LIST(R.string.tracking_category_preferences, R.string.p_badge_list), SET_BADGE_LIST(R.string.tracking_category_preferences, R.string.p_badge_list),
GTASK_DEFAULT_LIST(R.string.tracking_category_preferences, R.string.p_gtasks_default_list), DEFAULT_REMOTE_LIST(R.string.tracking_category_preferences, R.string.p_default_remote_list),
SET_THEME(R.string.tracking_category_preferences, R.string.p_theme), SET_THEME(R.string.tracking_category_preferences, R.string.p_theme),
SET_COLOR(R.string.tracking_category_preferences, R.string.p_theme_color), SET_COLOR(R.string.tracking_category_preferences, R.string.p_theme_color),
SET_ACCENT(R.string.tracking_category_preferences, R.string.p_theme_accent), SET_ACCENT(R.string.tracking_category_preferences, R.string.p_theme_accent),

@ -74,11 +74,19 @@ public class DefaultFilterProvider {
return getFilterFromPreference(R.string.p_default_list); return getFilterFromPreference(R.string.p_default_list);
} }
public Filter getDefaultRemoteList() {
return getFilterFromPreference(preferences.getStringValue(R.string.p_default_remote_list), null);
}
public Filter getFilterFromPreference(int resId) { public Filter getFilterFromPreference(int resId) {
return getFilterFromPreference(preferences.getStringValue(resId)); return getFilterFromPreference(preferences.getStringValue(resId));
} }
public Filter getFilterFromPreference(String preferenceValue) { public Filter getFilterFromPreference(String preferenceValue) {
return getFilterFromPreference(preferenceValue, BuiltInFilterExposer.getMyTasksFilter(context.getResources()));
}
private Filter getFilterFromPreference(String preferenceValue, Filter def) {
if (!isNullOrEmpty(preferenceValue)) { if (!isNullOrEmpty(preferenceValue)) {
try { try {
Filter filter = loadFilter(preferenceValue); Filter filter = loadFilter(preferenceValue);
@ -89,7 +97,7 @@ public class DefaultFilterProvider {
Timber.e(e, e.getMessage()); Timber.e(e, e.getMessage());
} }
} }
return BuiltInFilterExposer.getMyTasksFilter(context.getResources()); return def;
} }
private Filter loadFilter(String preferenceValue) { private Filter loadFilter(String preferenceValue) {
@ -122,6 +130,10 @@ public class DefaultFilterProvider {
setFilterPreference(filter, R.string.p_dashclock_filter); setFilterPreference(filter, R.string.p_dashclock_filter);
} }
public void setDefaultRemoteList(Filter filter) {
setFilterPreference(filter, R.string.p_default_remote_list);
}
private void setFilterPreference(Filter filter, int prefId) { private void setFilterPreference(Filter filter, int prefId) {
String filterPreferenceValue = getFilterPreferenceValue(filter); String filterPreferenceValue = getFilterPreferenceValue(filter);
if (!Strings.isNullOrEmpty(filterPreferenceValue)) { if (!Strings.isNullOrEmpty(filterPreferenceValue)) {

@ -0,0 +1,5 @@
<vector android:autoMirrored="true" android:height="24dp"
android:viewportHeight="24.0" android:viewportWidth="24.0"
android:width="24dp" xmlns:android="http://schemas.android.com/apk/res/android">
<path android:fillColor="#FF000000" android:pathData="M19.35,10.04C18.67,6.59 15.64,4 12,4c-1.48,0 -2.85,0.43 -4.01,1.17l1.46,1.46C10.21,6.23 11.08,6 12,6c3.04,0 5.5,2.46 5.5,5.5v0.5H19c1.66,0 3,1.34 3,3 0,1.13 -0.64,2.11 -1.56,2.62l1.45,1.45C23.16,18.16 24,16.68 24,15c0,-2.64 -2.05,-4.78 -4.65,-4.96zM3,5.27l2.75,2.74C2.56,8.15 0,10.77 0,14c0,3.31 2.69,6 6,6h11.73l2,2L21,20.73 4.27,4 3,5.27zM7.73,10l8,8H6c-2.21,0 -4,-1.79 -4,-4s1.79,-4 4,-4h1.73z"/>
</vector>

@ -6,5 +6,5 @@
android:layout_height="wrap_content" android:layout_height="wrap_content"
android:layout_gravity="top" android:layout_gravity="top"
android:gravity="start" android:gravity="start"
android:text="@string/default_value" android:hint="@string/dont_sync"
android:textAlignment="viewStart" /> android:textAlignment="viewStart" />

@ -263,7 +263,6 @@
<string name="p_theme">theme_style</string> <string name="p_theme">theme_style</string>
<string name="p_theme_color">theme_color</string> <string name="p_theme_color">theme_color</string>
<string name="p_theme_accent">theme_accent</string> <string name="p_theme_accent">theme_accent</string>
<string name="p_gtasks_default_list">default_gtasks_list</string>
<string name="p_language">language</string> <string name="p_language">language</string>
<string name="p_layout_direction">layout_direction</string> <string name="p_layout_direction">layout_direction</string>
<string name="p_led_notification">led_notificatiWCAon</string> <string name="p_led_notification">led_notificatiWCAon</string>
@ -278,6 +277,7 @@
<string name="p_widget_show_header">widget-show-header-</string> <string name="p_widget_show_header">widget-show-header-</string>
<string name="p_widget_show_settings">widget-show-settings-</string> <string name="p_widget_show_settings">widget-show-settings-</string>
<string name="p_dashclock_filter">dashclock_filter</string> <string name="p_dashclock_filter">dashclock_filter</string>
<string name="p_default_remote_list">default_remote_list</string>
<string name="sku_tasker">tasker</string> <string name="sku_tasker">tasker</string>
<string name="sku_dashclock">dashclock</string> <string name="sku_dashclock">dashclock</string>

@ -759,6 +759,7 @@ File %1$s contained %2$s.\n\n
<string name="no_title">(No title)</string> <string name="no_title">(No title)</string>
<string name="back_button_saves_task">Back button saves task</string> <string name="back_button_saves_task">Back button saves task</string>
<string name="default_list">Default list</string> <string name="default_list">Default list</string>
<string name="default_sync">Default sync</string>
<string name="plugin_description">Tasks is an open source project maintained by one developer. Some features are offered as in-app purchases in order to support development.</string> <string name="plugin_description">Tasks is an open source project maintained by one developer. Some features are offered as in-app purchases in order to support development.</string>
<string name="themes_purchase_description">Unlock all themes and add some color to Tasks</string> <string name="themes_purchase_description">Unlock all themes and add some color to Tasks</string>
<string name="tasker_description">Context-aware list notifications. Requires Tasker or Locale</string> <string name="tasker_description">Context-aware list notifications. Requires Tasker or Locale</string>
@ -861,6 +862,7 @@ File %1$s contained %2$s.\n\n
<string name="badges_description">Display a task count on Tasks launcher icon. Not all launchers support badges.</string> <string name="badges_description">Display a task count on Tasks launcher icon. Not all launchers support badges.</string>
<string name="bundle_notifications_summary">Combine multiple notifications into a single notification</string> <string name="bundle_notifications_summary">Combine multiple notifications into a single notification</string>
<string name="repeat_monthly_same_day_each_month">on the same day each month</string> <string name="repeat_monthly_same_day_each_month">on the same day each month</string>
<string name="dont_sync">Don\'t sync</string>
<string name="repeat_monthly_every_day_of_nth_week">every %1$s %2$s</string> <string name="repeat_monthly_every_day_of_nth_week">every %1$s %2$s</string>
<string name="repeat_monthly_on_every_day_of_nth_week">on every %1$s %2$s</string> <string name="repeat_monthly_on_every_day_of_nth_week">on every %1$s %2$s</string>

@ -17,6 +17,9 @@
android:entryValues="@array/EPr_default_urgency_values" android:entryValues="@array/EPr_default_urgency_values"
android:key="@string/p_default_urgency_key" android:key="@string/p_default_urgency_key"
android:title="@string/EPr_default_urgency_title" /> android:title="@string/EPr_default_urgency_title" />
<Preference
android:key="@string/p_default_remote_list"
android:title="@string/default_sync" />
<com.todoroo.astrid.ui.MultilineListPreference <com.todoroo.astrid.ui.MultilineListPreference
android:defaultValue="0" android:defaultValue="0"
android:entries="@array/EPr_default_hideUntil" android:entries="@array/EPr_default_hideUntil"

@ -13,11 +13,6 @@
android:key="@string/sync_gtasks" android:key="@string/sync_gtasks"
android:title="@string/enabled" /> android:title="@string/enabled" />
<Preference
android:dependency="@string/sync_gtasks"
android:key="@string/p_gtasks_default_list"
android:title="@string/default_list" />
<CheckBoxPreference <CheckBoxPreference
android:defaultValue="true" android:defaultValue="true"
android:dependency="@string/sync_gtasks" android:dependency="@string/sync_gtasks"

Loading…
Cancel
Save