Option for background sync on unmetered conn only

pull/699/head
Alex Baker 7 years ago
parent dee29eded4
commit d983167976

@ -977,6 +977,64 @@ public class Task implements Parcelable {
return remoteId != null ? remoteId.equals(task.remoteId) : task.remoteId == null; return remoteId != null ? remoteId.equals(task.remoteId) : task.remoteId == null;
} }
public boolean googleTaskUpToDate(Task original) {
if (this == original) {
return true;
}
if (original == null) {
return false;
}
if (title != null ? !title.equals(original.title) : original.title != null) {
return false;
}
if (dueDate != null ? !dueDate.equals(original.dueDate) : original.dueDate != null) {
return false;
}
if (completed != null ? !completed.equals(original.completed) : original.completed != null) {
return false;
}
if (deleted != null ? !deleted.equals(original.deleted) : original.deleted != null) {
return false;
}
return notes != null ? notes.equals(original.notes) : original.notes == null;
}
public boolean caldavUpToDate(Task original) {
if (this == original) {
return true;
}
if (original == null) {
return false;
}
if (title != null ? !title.equals(original.title) : original.title != null) {
return false;
}
if (importance != null ? !importance.equals(original.importance)
: original.importance != null) {
return false;
}
if (dueDate != null ? !dueDate.equals(original.dueDate) : original.dueDate != null) {
return false;
}
if (completed != null ? !completed.equals(original.completed) : original.completed != null) {
return false;
}
if (deleted != null ? !deleted.equals(original.deleted) : original.deleted != null) {
return false;
}
if (notes != null ? !notes.equals(original.notes) : original.notes != null) {
return false;
}
if (recurrence != null ? !recurrence.equals(original.recurrence)
: original.recurrence != null) {
return false;
}
return repeatUntil != null ? repeatUntil.equals(original.repeatUntil)
: original.repeatUntil == null;
}
public boolean isSaved() { public boolean isSaved() {
return getId() != NO_ID; return getId() != NO_ID;
} }

@ -14,6 +14,7 @@ import org.tasks.injection.ApplicationScope;
import org.tasks.injection.ForApplication; import org.tasks.injection.ForApplication;
import org.tasks.preferences.Preferences; import org.tasks.preferences.Preferences;
import org.tasks.scheduling.RefreshScheduler; import org.tasks.scheduling.RefreshScheduler;
import timber.log.Timber;
@ApplicationScope @ApplicationScope
public class JobCreator implements com.evernote.android.job.JobCreator { public class JobCreator implements com.evernote.android.job.JobCreator {
@ -32,6 +33,7 @@ public class JobCreator implements com.evernote.android.job.JobCreator {
static final String TAG_REFRESH = "tag_refresh"; static final String TAG_REFRESH = "tag_refresh";
static final String TAG_MIDNIGHT_REFRESH = "tag_midnight_refresh"; static final String TAG_MIDNIGHT_REFRESH = "tag_midnight_refresh";
static final String TAG_NOTIFICATION = "tag_notification"; static final String TAG_NOTIFICATION = "tag_notification";
static final String TAG_BACKGROUND_SYNC = "tag_background_sync";
static final String TAG_SYNC = "tag_sync"; static final String TAG_SYNC = "tag_sync";
@Inject @Inject
@ -57,6 +59,7 @@ public class JobCreator implements com.evernote.android.job.JobCreator {
case TAG_NOTIFICATION: case TAG_NOTIFICATION:
return new NotificationJob(preferences, notifier, notificationQueue); return new NotificationJob(preferences, notifier, notificationQueue);
case TAG_SYNC: case TAG_SYNC:
case TAG_BACKGROUND_SYNC:
return new SyncJob(caldavSynchronizer, googleTaskSynchronizer); return new SyncJob(caldavSynchronizer, googleTaskSynchronizer);
case TAG_BACKUP: case TAG_BACKUP:
return new BackupJob(context, tasksJsonExporter, preferences); return new BackupJob(context, tasksJsonExporter, preferences);
@ -64,7 +67,8 @@ public class JobCreator implements com.evernote.android.job.JobCreator {
case TAG_REFRESH: case TAG_REFRESH:
return new RefreshJob(refreshScheduler, localBroadcastManager); return new RefreshJob(refreshScheduler, localBroadcastManager);
default: default:
throw new IllegalArgumentException("Unhandled tag: " + tag); Timber.e("Unhandled tag: " + tag);
return null;
} }
} }
} }

@ -10,6 +10,7 @@ import com.evernote.android.job.JobRequest.Builder;
import com.evernote.android.job.JobRequest.NetworkType; import com.evernote.android.job.JobRequest.NetworkType;
import com.todoroo.astrid.gtasks.GtasksPreferenceService; import com.todoroo.astrid.gtasks.GtasksPreferenceService;
import java.util.concurrent.TimeUnit; import java.util.concurrent.TimeUnit;
import javax.annotation.Nullable;
import javax.inject.Inject; import javax.inject.Inject;
import org.tasks.R; import org.tasks.R;
import org.tasks.injection.ApplicationScope; import org.tasks.injection.ApplicationScope;
@ -64,38 +65,44 @@ public class JobManager {
} }
public void updateBackgroundSync() { public void updateBackgroundSync() {
updateBackgroundSync(false, false); updateBackgroundSync(null, null, null);
} }
public void updateBackgroundSync(boolean forceAccountPresent, boolean forceBackgroundEnabled) { public void updateBackgroundSync(@Nullable Boolean forceAccountPresent,
boolean backgroundEnabled = @Nullable Boolean forceBackgroundEnabled, @Nullable Boolean forceOnlyOnUnmetered) {
forceBackgroundEnabled || preferences.getBoolean(R.string.p_background_sync, true); boolean backgroundEnabled = forceBackgroundEnabled == null
boolean accountsPresent = ? preferences.getBoolean(R.string.p_background_sync, true)
forceAccountPresent || preferences.getBoolean(R.string.p_sync_caldav, false) || : forceBackgroundEnabled;
!isEmpty(preferences.getStringValue(GtasksPreferenceService.PREF_USER_NAME)); boolean accountsPresent = forceAccountPresent == null
scheduleBackgroundSynchronization(backgroundEnabled && accountsPresent); ? (preferences.getBoolean(R.string.sync_gtasks, false) || preferences.getBoolean(R.string.p_sync_caldav, false))
: forceAccountPresent;
boolean onlyOnWifi = forceOnlyOnUnmetered == null
? preferences.getBoolean(R.string.p_background_sync_unmetered_only, false)
: forceOnlyOnUnmetered;
scheduleBackgroundSynchronization(backgroundEnabled && accountsPresent, onlyOnWifi);
} }
private void scheduleBackgroundSynchronization(boolean enabled) { private void scheduleBackgroundSynchronization(boolean enabled, boolean onlyOnUnmetered) {
Timber.d("background sync enabled: %s", enabled); Timber.d("background sync enabled: %s, onlyOnUnmetered: %s", enabled, onlyOnUnmetered);
if (enabled) { if (enabled) {
new JobRequest.Builder(JobCreator.TAG_SYNC) new JobRequest.Builder(JobCreator.TAG_BACKGROUND_SYNC)
.setRequiredNetworkType(NetworkType.CONNECTED)
.setRequirementsEnforced(true)
.setPeriodic(TimeUnit.HOURS.toMillis(1)) .setPeriodic(TimeUnit.HOURS.toMillis(1))
.setRequiredNetworkType(onlyOnUnmetered ? NetworkType.UNMETERED : NetworkType.CONNECTED)
.setRequirementsEnforced(true)
.setUpdateCurrent(true) .setUpdateCurrent(true)
.build() .build()
.schedule(); .schedule();
} else { } else {
jobManager.cancelAllForTag(JobCreator.TAG_SYNC); jobManager.cancelAllForTag(JobCreator.TAG_BACKGROUND_SYNC);
} }
} }
public void syncNow() { public void syncNow() {
new JobRequest.Builder(JobCreator.TAG_SYNC) new JobRequest.Builder(JobCreator.TAG_SYNC)
.setExecutionWindow(TimeUnit.SECONDS.toMillis(1), TimeUnit.SECONDS.toMillis(5))
.setRequiredNetworkType(NetworkType.CONNECTED) .setRequiredNetworkType(NetworkType.CONNECTED)
.setRequirementsEnforced(true) .setRequirementsEnforced(true)
.setExecutionWindow(1, 5000) .setUpdateCurrent(true)
.build() .build()
.schedule(); .schedule();
} }

@ -1,11 +1,11 @@
package org.tasks.receivers; package org.tasks.receivers;
import com.google.common.base.Strings;
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 javax.inject.Inject; import javax.inject.Inject;
import org.tasks.jobs.JobManager; import org.tasks.jobs.JobManager;
import org.tasks.sync.SyncAdapters; import org.tasks.sync.SyncAdapters;
import timber.log.Timber;
public class PushReceiver { public class PushReceiver {
@ -19,45 +19,19 @@ public class PushReceiver {
} }
public void push(Task task, Task original) { public void push(Task task, Task original) {
if (!pushGoogleTasks(task, original)) { boolean googleTaskSyncEnabled = syncAdapters.isGoogleTaskSyncEnabled();
pushCaldav(task, original); boolean caldavSyncEnabled = syncAdapters.isCaldavSyncEnabled();
} if (!(googleTaskSyncEnabled || caldavSyncEnabled)) {
}
private boolean pushGoogleTasks(Task task, Task original) {
if (!syncAdapters.isGoogleTaskSyncEnabled()) {
return false;
}
if (task.checkTransitory(SyncFlags.GTASKS_SUPPRESS_SYNC)) {
return false;
}
if (original == null ||
!task.getTitle().equals(original.getTitle()) ||
(Strings.isNullOrEmpty(task.getNotes())
? !Strings.isNullOrEmpty(original.getNotes())
: !task.getNotes().equals(original.getNotes())) ||
!task.getDueDate().equals(original.getDueDate()) ||
!task.getCompletionDate().equals(original.getCompletionDate()) ||
!task.getDeletionDate().equals(original.getDeletionDate()) ||
task.checkAndClearTransitory(SyncFlags.FORCE_SYNC)) {
syncAdapters.syncNow();
return true;
}
return false;
}
private void pushCaldav(Task task, Task original) {
if (!syncAdapters.isCaldavSyncEnabled()) {
return; return;
} }
if (task.checkTransitory(SyncFlags.GTASKS_SUPPRESS_SYNC)) { if (task.checkTransitory(SyncFlags.GTASKS_SUPPRESS_SYNC)) {
Timber.d("Suppressed sync: %s", task);
return; return;
} }
if (task.checkAndClearTransitory(SyncFlags.FORCE_SYNC) ||
(googleTaskSyncEnabled && !task.googleTaskUpToDate(original)) ||
(caldavSyncEnabled && !task.caldavUpToDate(original))) {
jobManager.syncNow(); jobManager.syncNow();
} }
}
} }

@ -59,9 +59,8 @@ public class SynchronizationPreferences extends InjectingPreferenceActivity {
getString(R.string.p_sync_caldav)); getString(R.string.p_sync_caldav));
caldavEnabled.setChecked(syncAdapters.isCaldavSyncEnabled()); caldavEnabled.setChecked(syncAdapters.isCaldavSyncEnabled());
caldavEnabled.setOnPreferenceChangeListener((preference, newValue) -> { caldavEnabled.setOnPreferenceChangeListener((preference, newValue) -> {
boolean enabled = ((boolean) newValue); jobManager.updateBackgroundSync(((boolean) newValue), null, null);
jobManager.updateBackgroundSync(enabled, false); return true;
return enabled;
}); });
final CheckBoxPreference gtaskPreference = (CheckBoxPreference) findPreference( final CheckBoxPreference gtaskPreference = (CheckBoxPreference) findPreference(
getString(R.string.sync_gtasks)); getString(R.string.sync_gtasks));
@ -86,10 +85,14 @@ public class SynchronizationPreferences extends InjectingPreferenceActivity {
DateUtilities.getDateStringWithTime(SynchronizationPreferences.this, DateUtilities.getDateStringWithTime(SynchronizationPreferences.this,
gtasksPreferenceService.getLastSyncDate()))); gtasksPreferenceService.getLastSyncDate())));
} }
findPreference(getString(R.string.p_background_sync_unmetered_only))
.setOnPreferenceChangeListener((preference, o) -> {
jobManager.updateBackgroundSync(null, null, (Boolean) o);
return true;
});
findPreference(getString(R.string.p_background_sync)) findPreference(getString(R.string.p_background_sync))
.setOnPreferenceChangeListener((preference, o) -> { .setOnPreferenceChangeListener((preference, o) -> {
boolean enabled = (Boolean) o; jobManager.updateBackgroundSync(null, (Boolean) o, null);
jobManager.updateBackgroundSync(false, enabled);
return true; return true;
}); });
findPreference(getString(R.string.sync_SPr_forget_key)) findPreference(getString(R.string.sync_SPr_forget_key))

@ -295,5 +295,6 @@
<string name="p_strict_mode">strict_mode</string> <string name="p_strict_mode">strict_mode</string>
<string name="warned_play_services">warned_play_services</string> <string name="warned_play_services">warned_play_services</string>
<string name="p_sync_caldav">sync_caldav</string> <string name="p_sync_caldav">sync_caldav</string>
<string name="p_background_sync_unmetered_only">background_sync_unmetered_only</string>
</resources> </resources>

@ -888,4 +888,5 @@ File %1$s contained %2$s.\n\n
<string name="help">Help</string> <string name="help">Help</string>
<string name="calendar_not_found">Calendar not found</string> <string name="calendar_not_found">Calendar not found</string>
<string name="network_error">Connection failed</string> <string name="network_error">Connection failed</string>
<string name="background_sync_unmetered_only">Only on unmetered connections</string>
</resources> </resources>

@ -6,11 +6,6 @@
<PreferenceScreen xmlns:android="http://schemas.android.com/apk/res/android" <PreferenceScreen xmlns:android="http://schemas.android.com/apk/res/android"
android:title="@string/synchronization"> android:title="@string/synchronization">
<CheckBoxPreference
android:defaultValue="true"
android:key="@string/p_background_sync"
android:title="@string/sync_SPr_interval_title"/>
<PreferenceCategory android:title="@string/gtasks_GPr_header"> <PreferenceCategory android:title="@string/gtasks_GPr_header">
<com.todoroo.astrid.ui.MultilineCheckboxPreference <com.todoroo.astrid.ui.MultilineCheckboxPreference
@ -33,4 +28,17 @@
android:key="@string/p_sync_caldav" android:key="@string/p_sync_caldav"
android:title="@string/enabled" /> android:title="@string/enabled" />
</PreferenceCategory> </PreferenceCategory>
<PreferenceCategory android:title="@string/sync_SPr_interval_title">
<CheckBoxPreference
android:defaultValue="true"
android:key="@string/p_background_sync"
android:title="@string/enabled" />
<CheckBoxPreference
android:defaultValue="false"
android:dependency="@string/p_background_sync"
android:key="@string/p_background_sync_unmetered_only"
android:title="@string/background_sync_unmetered_only" />
</PreferenceCategory>
</PreferenceScreen> </PreferenceScreen>

Loading…
Cancel
Save