diff --git a/app/src/generic/java/org/tasks/gtasks/SyncAdapterHelper.java b/app/src/generic/java/org/tasks/gtasks/SyncAdapterHelper.java deleted file mode 100644 index 43af07826..000000000 --- a/app/src/generic/java/org/tasks/gtasks/SyncAdapterHelper.java +++ /dev/null @@ -1,32 +0,0 @@ -package org.tasks.gtasks; - -import com.todoroo.astrid.activity.TaskListFragment; - -import javax.inject.Inject; - -public class SyncAdapterHelper { - @Inject - public SyncAdapterHelper() { - - } - - public boolean shouldShowBackgroundSyncWarning() { - return false; - } - - public void checkPlayServices(TaskListFragment taskListFragment) { - - } - - public boolean initiateManualSync() { - return false; - } - - public boolean isEnabled() { - return false; - } - - public void requestSynchronization() { - - } -} diff --git a/app/src/main/java/com/todoroo/astrid/adapter/FilterAdapter.java b/app/src/main/java/com/todoroo/astrid/adapter/FilterAdapter.java index 196bb5f99..d2e2bc591 100644 --- a/app/src/main/java/com/todoroo/astrid/adapter/FilterAdapter.java +++ b/app/src/main/java/com/todoroo/astrid/adapter/FilterAdapter.java @@ -318,14 +318,17 @@ public class FilterAdapter extends ArrayAdapter { } } - addSubMenu(R.string.CalDAV, filterProvider.getCalDAVFilters(), false); + List calDAVFilters = filterProvider.getCalDAVFilters(); + if (!calDAVFilters.isEmpty()) { + addSubMenu(R.string.CalDAV, calDAVFilters, false); - if (navigationDrawer) { - add(new NavigationDrawerAction( - activity.getResources().getString(R.string.add_account), - R.drawable.ic_add_24dp, - new Intent(activity, CalDAVSettingsActivity.class), - NavigationDrawerFragment.REQUEST_NEW_CALDAV_ACCOUNT)); + if (navigationDrawer) { + add(new NavigationDrawerAction( + activity.getResources().getString(R.string.add_account), + R.drawable.ic_add_24dp, + new Intent(activity, CalDAVSettingsActivity.class), + NavigationDrawerFragment.REQUEST_NEW_CALDAV_ACCOUNT)); + } } if (navigationDrawer) { diff --git a/app/src/main/java/com/todoroo/astrid/gtasks/GtasksFilterExposer.java b/app/src/main/java/com/todoroo/astrid/gtasks/GtasksFilterExposer.java index 34996782b..6935ebe17 100644 --- a/app/src/main/java/com/todoroo/astrid/gtasks/GtasksFilterExposer.java +++ b/app/src/main/java/com/todoroo/astrid/gtasks/GtasksFilterExposer.java @@ -10,6 +10,7 @@ import com.todoroo.astrid.api.GtasksFilter; import org.tasks.data.GoogleTaskList; import org.tasks.gtasks.GtaskSyncAdapterHelper; +import org.tasks.sync.SyncAdapters; import java.util.List; @@ -27,17 +28,17 @@ import static java.util.Collections.emptyList; public class GtasksFilterExposer { private final GtasksListService gtasksListService; - private final GtaskSyncAdapterHelper gtaskSyncAdapterHelper; + private final SyncAdapters syncAdapters; @Inject - public GtasksFilterExposer(GtasksListService gtasksListService, GtaskSyncAdapterHelper gtaskSyncAdapterHelper) { + public GtasksFilterExposer(GtasksListService gtasksListService, SyncAdapters syncAdapters) { this.gtasksListService = gtasksListService; - this.gtaskSyncAdapterHelper = gtaskSyncAdapterHelper; + this.syncAdapters = syncAdapters; } public List getFilters() { // if we aren't logged in (or we are logged in to astrid.com), don't expose features - if(!gtaskSyncAdapterHelper.isEnabled()) { + if(!syncAdapters.isGoogleTaskSyncEnabled()) { return emptyList(); } @@ -49,7 +50,7 @@ public class GtasksFilterExposer { } public Filter getFilter(long id) { - if (gtaskSyncAdapterHelper.isEnabled()) { + if (syncAdapters.isGoogleTaskSyncEnabled()) { GoogleTaskList list = gtasksListService.getList(id); if (list != null) { return filterFromList(list); diff --git a/app/src/main/java/org/tasks/caldav/CalDAVFilterExposer.java b/app/src/main/java/org/tasks/caldav/CalDAVFilterExposer.java index a500ca786..61a63c56e 100644 --- a/app/src/main/java/org/tasks/caldav/CalDAVFilterExposer.java +++ b/app/src/main/java/org/tasks/caldav/CalDAVFilterExposer.java @@ -5,21 +5,28 @@ import com.todoroo.astrid.api.Filter; import org.tasks.data.CaldavAccount; import org.tasks.data.CaldavDao; +import org.tasks.sync.SyncAdapters; import java.util.ArrayList; +import java.util.Collections; import java.util.List; import javax.inject.Inject; public class CalDAVFilterExposer { private CaldavDao caldavDao; + private final SyncAdapters syncAdapters; @Inject - public CalDAVFilterExposer(CaldavDao caldavDao) { + public CalDAVFilterExposer(CaldavDao caldavDao, SyncAdapters syncAdapters) { this.caldavDao = caldavDao; + this.syncAdapters = syncAdapters; } public List getFilters() { + if (!syncAdapters.isCaldavSyncEnabled()) { + return Collections.emptyList(); + } List allOrderedByName = caldavDao.getAllOrderedByName(); List result = new ArrayList<>(); for (CaldavAccount account : allOrderedByName) { @@ -29,9 +36,12 @@ public class CalDAVFilterExposer { } public Filter getFilterByUuid(String uuid) { - CaldavAccount caldavAccount = caldavDao.getByUuid(uuid); - return caldavAccount == null - ? null - : new CaldavFilter(caldavAccount); + if (syncAdapters.isCaldavSyncEnabled()) { + CaldavAccount caldavAccount = caldavDao.getByUuid(uuid); + if (caldavAccount != null) { + return new CaldavFilter(caldavAccount); + } + } + return null; } } diff --git a/app/src/main/java/org/tasks/preferences/PermissionRequestor.java b/app/src/main/java/org/tasks/preferences/PermissionRequestor.java index b12004e53..c6ce57a69 100644 --- a/app/src/main/java/org/tasks/preferences/PermissionRequestor.java +++ b/app/src/main/java/org/tasks/preferences/PermissionRequestor.java @@ -8,9 +8,10 @@ public abstract class PermissionRequestor { public static final int REQUEST_FILE_WRITE = 50; public static final int REQUEST_CALENDAR = 51; public static final int REQUEST_MIC = 52; - public static final int REQUEST_ACCOUNTS = 53; + public static final int REQUEST_GOOGLE_ACCOUNTS = 53; public static final int REQUEST_LOCATION = 54; public static final int REQUEST_CONTACTS = 55; + public static final int REQUEST_CALDAV_ACCOUNTS = 56; private final PermissionChecker permissionChecker; @@ -52,7 +53,15 @@ public abstract class PermissionRequestor { if (permissionChecker.canAccessAccounts()) { return true; } - requestPermission(Manifest.permission.GET_ACCOUNTS, REQUEST_ACCOUNTS); + requestPermission(Manifest.permission.GET_ACCOUNTS, REQUEST_GOOGLE_ACCOUNTS); + return false; + } + + public boolean requestCaldavPermissions() { + if (permissionChecker.canAccessAccounts()) { + return true; + } + requestPermission(Manifest.permission.GET_ACCOUNTS, REQUEST_CALDAV_ACCOUNTS); return false; } diff --git a/app/src/main/java/org/tasks/preferences/Preferences.java b/app/src/main/java/org/tasks/preferences/Preferences.java index 036943362..131c4aa61 100644 --- a/app/src/main/java/org/tasks/preferences/Preferences.java +++ b/app/src/main/java/org/tasks/preferences/Preferences.java @@ -172,7 +172,7 @@ public class Preferences { PreferenceManager.setDefaultValues(context, R.xml.preferences_appearance, true); PreferenceManager.setDefaultValues(context, R.xml.preferences_date_time, true); PreferenceManager.setDefaultValues(context, R.xml.preferences_defaults, true); - PreferenceManager.setDefaultValues(context, R.xml.preferences_gtasks, true); + PreferenceManager.setDefaultValues(context, R.xml.preferences_synchronization, true); PreferenceManager.setDefaultValues(context, R.xml.preferences_misc, true); PreferenceManager.setDefaultValues(context, R.xml.preferences_privacy, true); PreferenceManager.setDefaultValues(context, R.xml.preferences_reminders, true); diff --git a/app/src/main/java/org/tasks/receivers/CalDAVPushReceiver.java b/app/src/main/java/org/tasks/receivers/CalDAVPushReceiver.java index 1eb5cb08a..7b82a33ee 100644 --- a/app/src/main/java/org/tasks/receivers/CalDAVPushReceiver.java +++ b/app/src/main/java/org/tasks/receivers/CalDAVPushReceiver.java @@ -4,22 +4,31 @@ import com.todoroo.astrid.data.SyncFlags; import com.todoroo.astrid.data.Task; import org.tasks.caldav.CaldavAccountManager; +import org.tasks.preferences.Preferences; +import org.tasks.sync.SyncAdapters; import javax.inject.Inject; public class CalDAVPushReceiver { private final CaldavAccountManager caldavAccountManager; + private final SyncAdapters syncAdapters; @Inject - public CalDAVPushReceiver(CaldavAccountManager caldavAccountManager) { + public CalDAVPushReceiver(CaldavAccountManager caldavAccountManager, SyncAdapters syncAdapters) { this.caldavAccountManager = caldavAccountManager; + this.syncAdapters = syncAdapters; } public void push(Task task, Task original) { + if (!syncAdapters.isCaldavSyncEnabled()) { + return; + } + if(task.checkTransitory(SyncFlags.GTASKS_SUPPRESS_SYNC)) { return; } + caldavAccountManager.requestSynchronization(); } } diff --git a/app/src/main/java/org/tasks/sync/SyncAdapters.java b/app/src/main/java/org/tasks/sync/SyncAdapters.java index 4370e8c6e..aaf0caef4 100644 --- a/app/src/main/java/org/tasks/sync/SyncAdapters.java +++ b/app/src/main/java/org/tasks/sync/SyncAdapters.java @@ -3,20 +3,28 @@ package org.tasks.sync; import android.app.Activity; import android.content.ContentResolver; +import org.tasks.R; import org.tasks.caldav.CaldavAccountManager; import org.tasks.gtasks.GtaskSyncAdapterHelper; +import org.tasks.preferences.PermissionChecker; +import org.tasks.preferences.Preferences; import javax.inject.Inject; public class SyncAdapters { private final GtaskSyncAdapterHelper gtaskSyncAdapterHelper; + private final Preferences preferences; private final CaldavAccountManager caldavAccountManager; + private final PermissionChecker permissionChecker; @Inject - public SyncAdapters(GtaskSyncAdapterHelper gtaskSyncAdapterHelper, CaldavAccountManager caldavAccountManager) { + public SyncAdapters(GtaskSyncAdapterHelper gtaskSyncAdapterHelper, Preferences preferences, + CaldavAccountManager caldavAccountManager, PermissionChecker permissionChecker) { this.gtaskSyncAdapterHelper = gtaskSyncAdapterHelper; + this.preferences = preferences; this.caldavAccountManager = caldavAccountManager; + this.permissionChecker = permissionChecker; } public void requestSynchronization() { @@ -41,7 +49,7 @@ public class SyncAdapters { } public boolean isCaldavSyncEnabled() { - return caldavAccountManager.getAccounts().size() > 0; + return preferences.getBoolean(R.string.p_sync_caldav, false) && permissionChecker.canAccessAccounts(); } public void checkPlayServices(Activity activity) { diff --git a/app/src/main/java/org/tasks/sync/SynchronizationPreferences.java b/app/src/main/java/org/tasks/sync/SynchronizationPreferences.java index c382a2c01..2170ded48 100644 --- a/app/src/main/java/org/tasks/sync/SynchronizationPreferences.java +++ b/app/src/main/java/org/tasks/sync/SynchronizationPreferences.java @@ -24,6 +24,7 @@ import org.tasks.gtasks.PlayServices; import org.tasks.injection.ActivityComponent; import org.tasks.injection.InjectingPreferenceActivity; import org.tasks.preferences.ActivityPermissionRequestor; +import org.tasks.preferences.PermissionChecker; import org.tasks.preferences.PermissionRequestor; import javax.inject.Inject; @@ -36,6 +37,7 @@ public class SynchronizationPreferences extends InjectingPreferenceActivity { @Inject GtasksPreferenceService gtasksPreferenceService; @Inject ActivityPermissionRequestor permissionRequestor; + @Inject PermissionChecker permissionChecker; @Inject Tracker tracker; @Inject GtaskSyncAdapterHelper gtaskSyncAdapterHelper; @Inject PlayServices playServices; @@ -47,10 +49,13 @@ public class SynchronizationPreferences extends InjectingPreferenceActivity { public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); - addPreferencesFromResource(R.xml.preferences_gtasks); + addPreferencesFromResource(R.xml.preferences_synchronization); + CheckBoxPreference caldavEnabled = (CheckBoxPreference) findPreference(getString(R.string.p_sync_caldav)); + caldavEnabled.setChecked(syncAdapters.isCaldavSyncEnabled()); + caldavEnabled.setOnPreferenceChangeListener((preference, newValue) -> ((boolean) newValue) && permissionRequestor.requestCaldavPermissions()); final CheckBoxPreference gtaskPreference = (CheckBoxPreference) findPreference(getString(R.string.sync_gtasks)); - gtaskPreference.setChecked(gtaskSyncAdapterHelper.isEnabled()); + gtaskPreference.setChecked(syncAdapters.isGoogleTaskSyncEnabled()); gtaskPreference.setOnPreferenceChangeListener((preference, newValue) -> { if ((boolean) newValue) { if (!playServices.refreshAndCheck()) { @@ -106,6 +111,10 @@ public class SynchronizationPreferences extends InjectingPreferenceActivity { } else { backgroundSync.setSummary(R.string.master_sync_warning); } + if (!permissionChecker.canAccessAccounts()) { + ((CheckBoxPreference) findPreference(getString(R.string.sync_gtasks))).setChecked(false); + ((CheckBoxPreference) findPreference(getString(R.string.p_sync_caldav))).setChecked(false); + } } @Override @@ -124,10 +133,13 @@ public class SynchronizationPreferences extends InjectingPreferenceActivity { @Override public void onRequestPermissionsResult(int requestCode, @NonNull String[] permissions, @NonNull int[] grantResults) { - if (requestCode == PermissionRequestor.REQUEST_ACCOUNTS) { + if (requestCode == PermissionRequestor.REQUEST_GOOGLE_ACCOUNTS) { if (verifyPermissions(grantResults)) { requestLogin(); } + } else if (requestCode == PermissionRequestor.REQUEST_CALDAV_ACCOUNTS) { + ((CheckBoxPreference) findPreference(getString(R.string.p_sync_caldav))) + .setChecked(verifyPermissions(grantResults)); } else { super.onRequestPermissionsResult(requestCode, permissions, grantResults); } diff --git a/app/src/main/res/values/keys.xml b/app/src/main/res/values/keys.xml index 26ec32d6e..fc115cf65 100644 --- a/app/src/main/res/values/keys.xml +++ b/app/src/main/res/values/keys.xml @@ -296,5 +296,6 @@ bundle_notifications strict_mode warned_play_services - + sync_caldav + diff --git a/app/src/main/res/xml/preferences.xml b/app/src/main/res/xml/preferences.xml index 47507f4ce..79c751dd5 100644 --- a/app/src/main/res/xml/preferences.xml +++ b/app/src/main/res/xml/preferences.xml @@ -45,7 +45,7 @@ android:key="@string/synchronization" android:title="@string/synchronization"> diff --git a/app/src/main/res/xml/preferences_gtasks.xml b/app/src/main/res/xml/preferences_synchronization.xml similarity index 82% rename from app/src/main/res/xml/preferences_gtasks.xml rename to app/src/main/res/xml/preferences_synchronization.xml index 62fe14cf1..1b533a8a4 100644 --- a/app/src/main/res/xml/preferences_gtasks.xml +++ b/app/src/main/res/xml/preferences_synchronization.xml @@ -27,4 +27,11 @@ + + + +