diff --git a/src/androidTest/java/com/todoroo/astrid/backup/BackupServiceTests.java b/src/androidTest/java/com/todoroo/astrid/backup/BackupServiceTests.java
deleted file mode 100644
index bf541e1d7..000000000
--- a/src/androidTest/java/com/todoroo/astrid/backup/BackupServiceTests.java
+++ /dev/null
@@ -1,188 +0,0 @@
-/**
- * Copyright (c) 2012 Todoroo Inc
- *
- * See the file "LICENSE" for the full license governing this code.
- */
-package com.todoroo.astrid.backup;
-
-import com.todoroo.andlib.utility.AndroidUtilities;
-import com.todoroo.astrid.backup.BackupService.BackupDirectorySetting;
-import com.todoroo.astrid.dao.TaskDao;
-import com.todoroo.astrid.data.Task;
-import com.todoroo.astrid.test.DatabaseTestCase;
-
-import org.tasks.R;
-import org.tasks.preferences.Preferences;
-
-import java.io.File;
-import java.io.IOException;
-import java.text.DateFormat;
-import java.text.SimpleDateFormat;
-
-import javax.inject.Inject;
-
-import static org.tasks.date.DateTimeUtils.newDate;
-
-public class BackupServiceTests extends DatabaseTestCase {
-
- private static final long BACKUP_WAIT_TIME = 500L;
-
- File temporaryDirectory = null;
-
- @Inject TasksXmlExporter xmlExporter;
- @Inject TaskDao taskDao;
- @Inject Preferences preferences;
-
- BackupDirectorySetting setting = new BackupDirectorySetting() {
- public File getBackupDirectory() {
- return temporaryDirectory;
- }
- };
-
- @Override
- protected void setUp() {
- super.setUp();
-
- try {
- temporaryDirectory = File.createTempFile("backup", Long.toString(System.nanoTime()));
- } catch (IOException e) {
- throw new RuntimeException(e);
- }
-
- if (!(temporaryDirectory.delete()))
- throw new RuntimeException("Could not delete temp file: " + temporaryDirectory.getAbsolutePath());
- if (!(temporaryDirectory.mkdir()))
- throw new RuntimeException("Could not create temp directory: " + temporaryDirectory.getAbsolutePath());
-
- // make a temporary task
- Task task = new Task();
- task.setTitle("helicopter");
- taskDao.createNew(task);
- }
-
- @Override
- protected void tearDown() {
- super.tearDown();
-
- if (temporaryDirectory != null) {
- for (File file : temporaryDirectory.listFiles())
- file.delete();
- temporaryDirectory.delete();
- }
- }
-
- private boolean getBackupSetting() {
- return preferences.getBoolean(R.string.backup_BPr_auto_key, true);
- }
-
- private void setBackupSetting(boolean setting) {
- preferences.setBoolean(R.string.backup_BPr_auto_key, setting);
- }
-
- public void disabled_testBackup() {
- assertEquals(0, temporaryDirectory.list().length);
-
- boolean backupSetting = getBackupSetting();
- try {
- setBackupSetting(true);
- preferences.setLong(BackupPreferences.PREF_BACKUP_LAST_DATE, 0);
-
- // create a backup
- BackupService service = new BackupService();
- service.setBackupDirectorySetting(setting);
- service.testBackup(xmlExporter, preferences, getContext());
-
- AndroidUtilities.sleepDeep(BACKUP_WAIT_TIME);
-
- // assert file created
- File[] files = temporaryDirectory.listFiles();
- assertEquals(1, files.length);
- assertTrue(files[0].getName().matches(BackupService.BACKUP_FILE_NAME_REGEX));
-
- // assert summary updated
- assertTrue(preferences.getLong(BackupPreferences.PREF_BACKUP_LAST_DATE, 0) > 0);
- assertNull(preferences.getStringValue(BackupPreferences.PREF_BACKUP_LAST_ERROR));
- } finally {
- setBackupSetting(backupSetting);
- }
- }
-
- public void disabled_testNoBackup() {
- assertEquals(0, temporaryDirectory.list().length);
- System.err.println("test no backup");
- boolean backupSetting = getBackupSetting();
- try {
- setBackupSetting(false);
- preferences.setLong(BackupPreferences.PREF_BACKUP_LAST_DATE, 0);
-
- // create a backup
- BackupService service = new BackupService();
- service.setBackupDirectorySetting(new BackupDirectorySetting() {
- public File getBackupDirectory() {
- fail("Why was this method called?");
- return null;
- }
- });
- service.testBackup(xmlExporter, preferences, getContext());
-
- AndroidUtilities.sleepDeep(BACKUP_WAIT_TIME);
-
- // assert no file created
- File[] files = temporaryDirectory.listFiles();
- assertEquals(0, files.length);
-
- // assert summary not updated
- assertEquals(0, preferences.getLong(BackupPreferences.PREF_BACKUP_LAST_DATE, 0));
- } finally {
- setBackupSetting(backupSetting);
- }
- }
-
- public void testDeletion() throws IOException {
- // create a bunch of backups
- assertEquals(0, temporaryDirectory.list().length);
-
- boolean backupSetting = getBackupSetting();
- try {
- setBackupSetting(true);
-
- // create some user files
- File myFile = new File(temporaryDirectory, "beans");
- myFile.createNewFile();
-
- // create some backup files
- for (int i = 0; i < 10; i++) {
- DateFormat df = new SimpleDateFormat("MMdd-HHmm");
- String name = String.format("auto.%02d%s.xml", i, df.format(newDate()));
- File tempFile = new File(temporaryDirectory, name);
- tempFile.createNewFile();
- }
-
- // make one really old
- File[] files = temporaryDirectory.listFiles();
- files[4].setLastModified(System.currentTimeMillis() - 20000);
-
- // assert files created
- assertEquals(11, files.length);
-
- // backup
- BackupService service = new BackupService();
- service.setBackupDirectorySetting(setting);
- service.testBackup(xmlExporter, preferences, getContext());
-
- AndroidUtilities.sleepDeep(BACKUP_WAIT_TIME);
-
- // assert the oldest file was deleted
- assertTrue(temporaryDirectory.listFiles().length < 11);
- assertFalse(files[4].exists());
-
- // assert user file still exists
- service.testBackup(xmlExporter, preferences, getContext());
- assertTrue(myFile.exists());
-
- } finally {
- setBackupSetting(backupSetting);
- }
- }
-
-}
diff --git a/src/androidTest/java/org/tasks/injection/TestModule.java b/src/androidTest/java/org/tasks/injection/TestModule.java
index 6f761c6f2..f275bc72d 100644
--- a/src/androidTest/java/org/tasks/injection/TestModule.java
+++ b/src/androidTest/java/org/tasks/injection/TestModule.java
@@ -2,7 +2,7 @@ package org.tasks.injection;
import android.content.Context;
-import com.todoroo.astrid.backup.BackupServiceTests;
+import org.tasks.scheduling.BackupServiceTests;
import com.todoroo.astrid.dao.Database;
import com.todoroo.astrid.dao.MetadataDaoTests;
import com.todoroo.astrid.dao.TaskDaoTests;
diff --git a/src/androidTest/java/org/tasks/scheduling/BackupServiceTests.java b/src/androidTest/java/org/tasks/scheduling/BackupServiceTests.java
new file mode 100644
index 000000000..158c85afa
--- /dev/null
+++ b/src/androidTest/java/org/tasks/scheduling/BackupServiceTests.java
@@ -0,0 +1,133 @@
+/**
+ * Copyright (c) 2012 Todoroo Inc
+ *
+ * See the file "LICENSE" for the full license governing this code.
+ */
+package org.tasks.scheduling;
+
+import com.todoroo.andlib.utility.AndroidUtilities;
+import com.todoroo.astrid.backup.BackupPreferences;
+import com.todoroo.astrid.backup.TasksXmlExporter;
+import com.todoroo.astrid.dao.TaskDao;
+import com.todoroo.astrid.data.Task;
+import com.todoroo.astrid.test.DatabaseTestCase;
+
+import org.tasks.preferences.Preferences;
+
+import java.io.File;
+import java.io.IOException;
+import java.text.DateFormat;
+import java.text.SimpleDateFormat;
+
+import javax.inject.Inject;
+
+import static org.tasks.date.DateTimeUtils.newDate;
+
+public class BackupServiceTests extends DatabaseTestCase {
+
+ private static final long BACKUP_WAIT_TIME = 500L;
+
+ File temporaryDirectory = null;
+
+ @Inject TasksXmlExporter xmlExporter;
+ @Inject TaskDao taskDao;
+ @Inject Preferences preferences;
+
+ BackupIntentService.BackupDirectorySetting setting = new BackupIntentService.BackupDirectorySetting() {
+ public File getBackupDirectory() {
+ return temporaryDirectory;
+ }
+ };
+
+ @Override
+ protected void setUp() {
+ super.setUp();
+
+ try {
+ temporaryDirectory = File.createTempFile("backup", Long.toString(System.nanoTime()));
+ } catch (IOException e) {
+ throw new RuntimeException(e);
+ }
+
+ if (!(temporaryDirectory.delete()))
+ throw new RuntimeException("Could not delete temp file: " + temporaryDirectory.getAbsolutePath());
+ if (!(temporaryDirectory.mkdir()))
+ throw new RuntimeException("Could not create temp directory: " + temporaryDirectory.getAbsolutePath());
+
+ // make a temporary task
+ Task task = new Task();
+ task.setTitle("helicopter");
+ taskDao.createNew(task);
+ }
+
+ @Override
+ protected void tearDown() {
+ super.tearDown();
+
+ if (temporaryDirectory != null) {
+ for (File file : temporaryDirectory.listFiles())
+ file.delete();
+ temporaryDirectory.delete();
+ }
+ }
+
+ public void disabled_testBackup() {
+ assertEquals(0, temporaryDirectory.list().length);
+
+ preferences.setLong(BackupPreferences.PREF_BACKUP_LAST_DATE, 0);
+
+ // create a backup
+ BackupIntentService service = new BackupIntentService();
+ service.setBackupDirectorySetting(setting);
+ service.testBackup(xmlExporter, preferences, getContext());
+
+ AndroidUtilities.sleepDeep(BACKUP_WAIT_TIME);
+
+ // assert file created
+ File[] files = temporaryDirectory.listFiles();
+ assertEquals(1, files.length);
+ assertTrue(files[0].getName().matches(BackupIntentService.BACKUP_FILE_NAME_REGEX));
+
+ // assert summary updated
+ assertTrue(preferences.getLong(BackupPreferences.PREF_BACKUP_LAST_DATE, 0) > 0);
+ }
+
+ public void testDeletion() throws IOException {
+ // create a bunch of backups
+ assertEquals(0, temporaryDirectory.list().length);
+
+ // create some user files
+ File myFile = new File(temporaryDirectory, "beans");
+ myFile.createNewFile();
+
+ // create some backup files
+ for (int i = 0; i < 10; i++) {
+ DateFormat df = new SimpleDateFormat("MMdd-HHmm");
+ String name = String.format("auto.%02d%s.xml", i, df.format(newDate()));
+ File tempFile = new File(temporaryDirectory, name);
+ tempFile.createNewFile();
+ }
+
+ // make one really old
+ File[] files = temporaryDirectory.listFiles();
+ files[4].setLastModified(System.currentTimeMillis() - 20000);
+
+ // assert files created
+ assertEquals(11, files.length);
+
+ // backup
+ BackupIntentService service = new BackupIntentService();
+ service.setBackupDirectorySetting(setting);
+ service.testBackup(xmlExporter, preferences, getContext());
+
+ AndroidUtilities.sleepDeep(BACKUP_WAIT_TIME);
+
+ // assert the oldest file was deleted
+ assertTrue(temporaryDirectory.listFiles().length < 11);
+ assertFalse(files[4].exists());
+
+ // assert user file still exists
+ service.testBackup(xmlExporter, preferences, getContext());
+ assertTrue(myFile.exists());
+ }
+}
diff --git a/src/main/AndroidManifest.xml b/src/main/AndroidManifest.xml
index c0160f0c6..2f0f9e068 100644
--- a/src/main/AndroidManifest.xml
+++ b/src/main/AndroidManifest.xml
@@ -176,7 +176,7 @@
-
+
@@ -411,7 +411,6 @@
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
@@ -481,7 +466,47 @@
-
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
[%thread] %-5level - %msg%n
diff --git a/src/main/java/com/todoroo/astrid/activity/TaskListActivity.java b/src/main/java/com/todoroo/astrid/activity/TaskListActivity.java
index 7e67ca10a..f33b0b3fa 100644
--- a/src/main/java/com/todoroo/astrid/activity/TaskListActivity.java
+++ b/src/main/java/com/todoroo/astrid/activity/TaskListActivity.java
@@ -7,7 +7,10 @@ package com.todoroo.astrid.activity;
import android.app.Activity;
import android.app.AlertDialog;
+import android.content.BroadcastReceiver;
+import android.content.Context;
import android.content.Intent;
+import android.content.IntentFilter;
import android.net.Uri;
import android.os.Bundle;
import android.support.v4.view.MenuItemCompat;
@@ -72,6 +75,13 @@ public class TaskListActivity extends AstridActivity implements OnPageChangeList
public static final String OPEN_TASK = "openTask"; //$NON-NLS-1$
+ private final BroadcastReceiver refreshReceiver = new BroadcastReceiver() {
+ @Override
+ public void onReceive(Context context, Intent intent) {
+ refreshTaskList();
+ }
+ };
+
/**
* @see android.app.Activity#onCreate(Bundle)
*/
@@ -129,9 +139,18 @@ public class TaskListActivity extends AstridActivity implements OnPageChangeList
protected void onResume() {
super.onResume();
+ registerReceiver(refreshReceiver, new IntentFilter(AstridApiConstants.BROADCAST_EVENT_REFRESH));
+
getTaskListFragment().setSyncOngoing(gtasksPreferenceService.isOngoing());
}
+ @Override
+ protected void onPause() {
+ super.onPause();
+
+ unregisterReceiver(refreshReceiver);
+ }
+
@Override
public boolean onCreateOptionsMenu(Menu menu) {
if (isDrawerOpen()) {
diff --git a/src/main/java/com/todoroo/astrid/activity/TaskListFragment.java b/src/main/java/com/todoroo/astrid/activity/TaskListFragment.java
index 070204df6..6ce32b806 100644
--- a/src/main/java/com/todoroo/astrid/activity/TaskListFragment.java
+++ b/src/main/java/com/todoroo/astrid/activity/TaskListFragment.java
@@ -490,8 +490,7 @@ public class TaskListFragment extends InjectingListFragment implements OnSortSel
public void onResume() {
super.onResume();
- getActivity().registerReceiver(refreshReceiver,
- new IntentFilter(AstridApiConstants.BROADCAST_EVENT_REFRESH));
+ getActivity().registerReceiver(refreshReceiver, new IntentFilter(AstridApiConstants.BROADCAST_EVENT_REFRESH));
if (Flags.checkAndClear(Flags.REFRESH)) {
refresh();
@@ -565,8 +564,7 @@ public class TaskListFragment extends InjectingListFragment implements OnSortSel
protected class RefreshReceiver extends BroadcastReceiver {
@Override
public void onReceive(Context context, Intent intent) {
- if (intent == null
- || !AstridApiConstants.BROADCAST_EVENT_REFRESH.equals(intent.getAction())) {
+ if (intent == null || !AstridApiConstants.BROADCAST_EVENT_REFRESH.equals(intent.getAction())) {
return;
}
diff --git a/src/main/java/com/todoroo/astrid/adapter/FilterAdapter.java b/src/main/java/com/todoroo/astrid/adapter/FilterAdapter.java
index 5c274db6e..f773b9c17 100644
--- a/src/main/java/com/todoroo/astrid/adapter/FilterAdapter.java
+++ b/src/main/java/com/todoroo/astrid/adapter/FilterAdapter.java
@@ -258,7 +258,7 @@ public class FilterAdapter extends ArrayAdapter {
* Call this method from your activity's onResume() method
*/
public void registerRecevier() {
- activity.registerReceiver(filterListUpdateReceiver, new IntentFilter(AstridApiConstants.BROADCAST_EVENT_FILTER_LIST_UPDATED));
+ activity.registerReceiver(filterListUpdateReceiver, new IntentFilter(AstridApiConstants.BROADCAST_EVENT_REFRESH));
getLists();
refreshFilterCount();
diff --git a/src/main/java/com/todoroo/astrid/api/AstridApiConstants.java b/src/main/java/com/todoroo/astrid/api/AstridApiConstants.java
index c7a9323ca..0b371e223 100644
--- a/src/main/java/com/todoroo/astrid/api/AstridApiConstants.java
+++ b/src/main/java/com/todoroo/astrid/api/AstridApiConstants.java
@@ -99,15 +99,6 @@ public class AstridApiConstants {
*/
public static final String BROADCAST_EVENT_REFRESH = API_PACKAGE + ".REFRESH";
- /**
- * Action name for broadcast intent notifying that task was created or
- * title was changed
- * EXTRAS_TASK_ID id of the task
- */
- public static final String BROADCAST_EVENT_TASK_LIST_UPDATED = API_PACKAGE + ".TASK_LIST_UPDATED";
-
- public static final String BROADCAST_EVENT_FILTER_LIST_UPDATED = API_PACKAGE + ".FILTER_LIST_UPDATED";
-
/**
* Action name for broadcast intent notifying that task was completed
* EXTRAS_TASK_ID id of the task
@@ -139,5 +130,5 @@ public class AstridApiConstants {
* Action name for broadcast intent notifying that tag was renamed
*/
public static final String BROADCAST_EVENT_TAG_RENAMED = API_PACKAGE + ".TAG_RENAMED";
-
+
}
diff --git a/src/main/java/com/todoroo/astrid/backup/BackupPreferences.java b/src/main/java/com/todoroo/astrid/backup/BackupPreferences.java
index a02d416ee..c27ed26f9 100644
--- a/src/main/java/com/todoroo/astrid/backup/BackupPreferences.java
+++ b/src/main/java/com/todoroo/astrid/backup/BackupPreferences.java
@@ -34,9 +34,9 @@ import static org.tasks.date.DateTimeUtils.newDate;
*/
public class BackupPreferences extends TodorooPreferenceActivity {
- static final String PREF_BACKUP_LAST_DATE = "backupDate"; //$NON-NLS-1$
+ public static final String PREF_BACKUP_LAST_DATE = "backupDate"; //$NON-NLS-1$
- static final String PREF_BACKUP_LAST_ERROR = "backupError"; //$NON-NLS-1$
+ public static final String PREF_BACKUP_LAST_ERROR = "backupError"; //$NON-NLS-1$
private int statusColor = Color.BLACK;
@@ -85,28 +85,11 @@ public class BackupPreferences extends TodorooPreferenceActivity {
});
}
- @Override
- protected void onPause() {
- super.onPause();
- BackupService.scheduleService(preferences, this);
- }
-
@Override
public void updatePreferences(Preference preference, Object value) {
final Resources r = getResources();
- // auto
- if (r.getString(R.string.backup_BPr_auto_key).equals(
- preference.getKey())) {
- if (value != null && !(Boolean)value) {
- preference.setSummary(R.string.backup_BPr_auto_disabled);
- } else {
- preference.setSummary(R.string.backup_BPr_auto_enabled);
- }
- }
-
- // status
- else if (r.getString(R.string.backup_BPr_status_key).equals(preference.getKey())) {
+ if (r.getString(R.string.backup_BPr_status_key).equals(preference.getKey())) {
String status;
String subtitle = ""; //$NON-NLS-1$
diff --git a/src/main/java/com/todoroo/astrid/backup/BackupStartupReceiver.java b/src/main/java/com/todoroo/astrid/backup/BackupStartupReceiver.java
deleted file mode 100644
index 4a8e289ff..000000000
--- a/src/main/java/com/todoroo/astrid/backup/BackupStartupReceiver.java
+++ /dev/null
@@ -1,30 +0,0 @@
-/**
- * Copyright (c) 2012 Todoroo Inc
- *
- * See the file "LICENSE" for the full license governing this code.
- */
-package com.todoroo.astrid.backup;
-
-import android.content.Context;
-import android.content.Intent;
-
-import com.todoroo.andlib.service.ContextManager;
-
-import org.tasks.injection.InjectingBroadcastReceiver;
-import org.tasks.preferences.Preferences;
-
-import javax.inject.Inject;
-
-public class BackupStartupReceiver extends InjectingBroadcastReceiver {
-
- @Inject Preferences preferences;
-
- @Override
- /** Called when device is restarted */
- public void onReceive(final Context context, Intent intent) {
- super.onReceive(context, intent);
-
- ContextManager.setContext(context);
- BackupService.scheduleService(preferences, context);
- }
-}
diff --git a/src/main/java/com/todoroo/astrid/backup/TasksXmlExporter.java b/src/main/java/com/todoroo/astrid/backup/TasksXmlExporter.java
index da04b16fc..0713c361b 100644
--- a/src/main/java/com/todoroo/astrid/backup/TasksXmlExporter.java
+++ b/src/main/java/com/todoroo/astrid/backup/TasksXmlExporter.java
@@ -74,8 +74,14 @@ public class TasksXmlExporter {
private File backupDirectory;
private String latestSetVersionName;
+ private void post(Runnable runnable) {
+ if (handler != null) {
+ handler.post(runnable);
+ }
+ }
+
private void setProgress(final int taskNumber, final int total) {
- handler.post(new Runnable() {
+ post(new Runnable() {
@Override
public void run() {
progressDialog.setMax(total);
@@ -99,7 +105,7 @@ public class TasksXmlExporter {
BackupConstants.defaultExportDirectory() : backupDirectoryOverride;
this.latestSetVersionName = null;
- handler = new Handler();
+ handler = exportType == ExportType.EXPORT_TYPE_MANUAL ? new Handler() : null;
progressDialog = new ProgressDialog(context);
if(exportType == ExportType.EXPORT_TYPE_MANUAL) {
progressDialog.setIcon(android.R.drawable.ic_dialog_info);
@@ -135,7 +141,7 @@ public class TasksXmlExporter {
} catch (IOException e) {
log.error(e.getMessage(), e);
} finally {
- handler.post(new Runnable() {
+ post(new Runnable() {
@Override
public void run() {
if(progressDialog.isShowing() && context instanceof Activity) {
@@ -291,7 +297,7 @@ public class TasksXmlExporter {
xml.attribute(null, property.name, value);
} catch (UnsupportedOperationException e) {
// didn't read this value, do nothing
- log.debug(e.getMessage(), e);
+ log.trace(e.getMessage(), e);
} catch (IllegalArgumentException | IOException | IllegalStateException e) {
throw new RuntimeException(e);
}
@@ -300,7 +306,7 @@ public class TasksXmlExporter {
}
private void onFinishExport(final String outputFile) {
- handler.post(new Runnable() {
+ post(new Runnable() {
@Override
public void run() {
if(exportCount == 0) {
diff --git a/src/main/java/com/todoroo/astrid/dao/TaskDao.java b/src/main/java/com/todoroo/astrid/dao/TaskDao.java
index d6e762f65..e6f0768af 100644
--- a/src/main/java/com/todoroo/astrid/dao/TaskDao.java
+++ b/src/main/java/com/todoroo/astrid/dao/TaskDao.java
@@ -358,7 +358,7 @@ public class TaskDao extends RemoteModelDao {
* Send broadcast when task list changes. Widgets should update.
*/
private void broadcastTaskChanged() {
- broadcaster.taskListUpdated();
+ broadcaster.refresh();
}
/**
diff --git a/src/main/java/com/todoroo/astrid/helper/SyncActionHelper.java b/src/main/java/com/todoroo/astrid/helper/SyncActionHelper.java
index 62569993f..6a1c74132 100644
--- a/src/main/java/com/todoroo/astrid/helper/SyncActionHelper.java
+++ b/src/main/java/com/todoroo/astrid/helper/SyncActionHelper.java
@@ -45,9 +45,7 @@ public class SyncActionHelper {
syncResultCallback = new IndeterminateProgressBarSyncResultCallback(gtasksPreferenceService, activity, new Runnable() {
@Override
public void run() {
- activity.sendBroadcast(
- new Intent(
- AstridApiConstants.BROADCAST_EVENT_REFRESH));
+ activity.sendBroadcast(new Intent(AstridApiConstants.BROADCAST_EVENT_REFRESH));
}
});
}
diff --git a/src/main/java/com/todoroo/astrid/reminders/ReminderSchedulingService.java b/src/main/java/com/todoroo/astrid/reminders/ReminderSchedulingService.java
deleted file mode 100644
index 100df2725..000000000
--- a/src/main/java/com/todoroo/astrid/reminders/ReminderSchedulingService.java
+++ /dev/null
@@ -1,74 +0,0 @@
-/**
- * Copyright (c) 2012 Todoroo Inc
- *
- * See the file "LICENSE" for the full license governing this code.
- */
-package com.todoroo.astrid.reminders;
-
-import android.content.Intent;
-import android.os.IBinder;
-
-import com.todoroo.andlib.service.ContextManager;
-import com.todoroo.andlib.utility.AndroidUtilities;
-import com.todoroo.astrid.alarms.AlarmService;
-import com.todoroo.astrid.dao.TaskDao;
-
-import org.slf4j.Logger;
-import org.slf4j.LoggerFactory;
-import org.tasks.injection.InjectingService;
-import org.tasks.scheduling.RefreshScheduler;
-
-import javax.inject.Inject;
-
-/**
- * Schedules reminders in the background to prevent ANR's
- *
- * @author Tim Su
- *
- */
-public class ReminderSchedulingService extends InjectingService {
-
- private static final Logger log = LoggerFactory.getLogger(ReminderSchedulingService.class);
-
- @Inject RefreshScheduler refreshScheduler;
- @Inject AlarmService alarmService;
- @Inject ReminderService reminderService;
- @Inject TaskDao taskDao;
-
- /** Receive the alarm - start the synchronize service! */
- @Override
- public int onStartCommand(Intent intent, int flags, int startId) {
- ContextManager.setContext(ReminderSchedulingService.this);
-
- new Thread(new Runnable() {
- @Override
- public void run() {
- delaySchedulingToPreventANRs();
- scheduleReminders();
- stopSelf();
- }
- }).start();
-
- return START_NOT_STICKY;
- }
-
- private void scheduleReminders() {
- try {
- reminderService.scheduleAllAlarms(taskDao);
- alarmService.scheduleAllAlarms();
- refreshScheduler.scheduleAllAlarms();
-
- } catch (Exception e) {
- log.error(e.getMessage(), e);
- }
- }
-
- private void delaySchedulingToPreventANRs() {
- AndroidUtilities.sleepDeep(5000L);
- }
-
- @Override
- public IBinder onBind(Intent intent) {
- return null;
- }
-}
diff --git a/src/main/java/com/todoroo/astrid/reminders/ReminderStartupReceiver.java b/src/main/java/com/todoroo/astrid/reminders/ReminderStartupReceiver.java
deleted file mode 100644
index 18f105f89..000000000
--- a/src/main/java/com/todoroo/astrid/reminders/ReminderStartupReceiver.java
+++ /dev/null
@@ -1,32 +0,0 @@
-/**
- * Copyright (c) 2012 Todoroo Inc
- *
- * See the file "LICENSE" for the full license governing this code.
- */
-package com.todoroo.astrid.reminders;
-
-import android.content.BroadcastReceiver;
-import android.content.Context;
-import android.content.Intent;
-
-import com.todoroo.andlib.service.ContextManager;
-
-/**
- * Service which handles jobs that need to be run when phone boots
- *
- * @author Tim Su
- *
- */
-public class ReminderStartupReceiver extends BroadcastReceiver {
-
- @Override
- /** Called when the system is started up */
- public void onReceive(Context context, Intent intent) {
- ContextManager.setContext(context);
- startReminderSchedulingService(context);
- }
-
- public static void startReminderSchedulingService(Context context) {
- context.startService(new Intent(context, ReminderSchedulingService.class));
- }
-}
diff --git a/src/main/java/com/todoroo/astrid/service/StartupService.java b/src/main/java/com/todoroo/astrid/service/StartupService.java
index cfea797e3..2e7f5b401 100644
--- a/src/main/java/com/todoroo/astrid/service/StartupService.java
+++ b/src/main/java/com/todoroo/astrid/service/StartupService.java
@@ -27,7 +27,6 @@ import com.todoroo.andlib.sql.Query;
import com.todoroo.andlib.utility.AndroidUtilities;
import com.todoroo.andlib.utility.DialogUtilities;
import com.todoroo.astrid.backup.BackupConstants;
-import com.todoroo.astrid.backup.BackupService;
import com.todoroo.astrid.backup.TasksXmlImporter;
import com.todoroo.astrid.dao.Database;
import com.todoroo.astrid.dao.MetadataDao;
@@ -41,12 +40,12 @@ import com.todoroo.astrid.gtasks.GtasksPreferenceService;
import com.todoroo.astrid.gtasks.sync.GtasksSyncService;
import com.todoroo.astrid.provider.Astrid2TaskProvider;
import com.todoroo.astrid.provider.Astrid3ContentProvider;
-import com.todoroo.astrid.reminders.ReminderStartupReceiver;
import com.todoroo.astrid.tags.TaskToTagMetadata;
import com.todoroo.astrid.utility.Constants;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
+import org.tasks.Broadcaster;
import org.tasks.R;
import org.tasks.preferences.Preferences;
@@ -80,6 +79,7 @@ public class StartupService {
private final TasksXmlImporter xmlImporter;
private final CalendarAlarmScheduler calendarAlarmScheduler;
private final TaskDeleter taskDeleter;
+ private Broadcaster broadcaster;
@Inject
public StartupService(UpgradeService upgradeService, TaskService taskService,
@@ -87,7 +87,8 @@ public class StartupService {
GtasksPreferenceService gtasksPreferenceService,
GtasksSyncService gtasksSyncService, MetadataDao metadataDao,
Preferences preferences, TasksXmlImporter xmlImporter,
- CalendarAlarmScheduler calendarAlarmScheduler, TaskDeleter taskDeleter) {
+ CalendarAlarmScheduler calendarAlarmScheduler, TaskDeleter taskDeleter,
+ Broadcaster broadcaster) {
this.upgradeService = upgradeService;
this.taskService = taskService;
this.tagDataDao = tagDataDao;
@@ -99,6 +100,7 @@ public class StartupService {
this.xmlImporter = xmlImporter;
this.calendarAlarmScheduler = calendarAlarmScheduler;
this.taskDeleter = taskDeleter;
+ this.broadcaster = broadcaster;
}
/**
@@ -186,10 +188,6 @@ public class StartupService {
// if sync ongoing flag was set, clear it
gtasksPreferenceService.stopOngoing();
- // perform initialization
- ReminderStartupReceiver.startReminderSchedulingService(activity);
- BackupService.scheduleService(preferences, activity);
-
gtasksSyncService.initialize();
// get and display update messages
@@ -201,6 +199,10 @@ public class StartupService {
preferences.setDefaults();
+ if (latestSetVersion == 0) {
+ broadcaster.firstLaunch();
+ }
+
calendarAlarmScheduler.scheduleCalendarAlarms(activity, false); // This needs to be after set preference defaults for the purposes of ab testing
showTaskKillerHelp(activity);
diff --git a/src/main/java/com/todoroo/astrid/service/TaskService.java b/src/main/java/com/todoroo/astrid/service/TaskService.java
index 2b5745b26..777500cba 100644
--- a/src/main/java/com/todoroo/astrid/service/TaskService.java
+++ b/src/main/java/com/todoroo/astrid/service/TaskService.java
@@ -229,7 +229,7 @@ public class TaskService {
filterCounter.refreshFilterCounts(new Runnable() {
@Override
public void run() {
- broadcaster.filterListUpdated();
+ broadcaster.refresh();
}
});
}
diff --git a/src/main/java/com/todoroo/astrid/widget/TasksWidget.java b/src/main/java/com/todoroo/astrid/widget/TasksWidget.java
index 036d4bfd9..60bd1e1ef 100644
--- a/src/main/java/com/todoroo/astrid/widget/TasksWidget.java
+++ b/src/main/java/com/todoroo/astrid/widget/TasksWidget.java
@@ -30,7 +30,7 @@ import org.tasks.widget.WidgetHelper;
import javax.inject.Inject;
import static com.todoroo.andlib.utility.AndroidUtilities.preIceCreamSandwich;
-import static com.todoroo.astrid.api.AstridApiConstants.BROADCAST_EVENT_TASK_LIST_UPDATED;
+import static com.todoroo.astrid.api.AstridApiConstants.BROADCAST_EVENT_REFRESH;
public class TasksWidget extends InjectingAppWidgetProvider {
@@ -65,7 +65,7 @@ public class TasksWidget extends InjectingAppWidgetProvider {
context.startActivity(intent);
break;
- case BROADCAST_EVENT_TASK_LIST_UPDATED:
+ case BROADCAST_EVENT_REFRESH:
updateWidgets(context);
break;
}
diff --git a/src/main/java/org/tasks/Broadcaster.java b/src/main/java/org/tasks/Broadcaster.java
index d5ec05447..99b5f6b50 100644
--- a/src/main/java/org/tasks/Broadcaster.java
+++ b/src/main/java/org/tasks/Broadcaster.java
@@ -9,6 +9,7 @@ import com.todoroo.astrid.reminders.Notifications;
import com.todoroo.astrid.utility.Constants;
import org.tasks.injection.ForApplication;
+import org.tasks.receivers.FirstLaunchReceiver;
import javax.inject.Inject;
import javax.inject.Singleton;
@@ -44,15 +45,7 @@ public class Broadcaster {
}});
}
- public void taskListUpdated() {
- sendOrderedBroadcast(new Intent(AstridApiConstants.BROADCAST_EVENT_TASK_LIST_UPDATED));
- }
-
- public void filterListUpdated() {
- sendOrderedBroadcast(new Intent(AstridApiConstants.BROADCAST_EVENT_FILTER_LIST_UPDATED));
- }
-
- public void eventRefresh() {
+ public void refresh() {
context.sendBroadcast(new Intent(AstridApiConstants.BROADCAST_EVENT_REFRESH));
}
@@ -63,4 +56,8 @@ public class Broadcaster {
void sendOrderedBroadcast(Intent intent, String permissions) {
context.sendOrderedBroadcast(intent, permissions);
}
+
+ public void firstLaunch() {
+ context.sendBroadcast(new Intent(context, FirstLaunchReceiver.class));
+ }
}
diff --git a/src/main/java/org/tasks/date/DateTimeUtils.java b/src/main/java/org/tasks/date/DateTimeUtils.java
index dc35fbc17..e93cb39ed 100644
--- a/src/main/java/org/tasks/date/DateTimeUtils.java
+++ b/src/main/java/org/tasks/date/DateTimeUtils.java
@@ -1,5 +1,7 @@
package org.tasks.date;
+import org.joda.time.DateTime;
+
import java.util.Date;
public class DateTimeUtils {
@@ -24,4 +26,7 @@ public class DateTimeUtils {
return newDate(Date.UTC(year - 1900, month - 1, day, hour, minute, second));
}
+ public static DateTime newDateTime(long timestamp) {
+ return new DateTime(timestamp);
+ }
}
diff --git a/src/main/java/org/tasks/injection/BroadcastModule.java b/src/main/java/org/tasks/injection/BroadcastModule.java
index a5ee239d8..6963ed5d6 100644
--- a/src/main/java/org/tasks/injection/BroadcastModule.java
+++ b/src/main/java/org/tasks/injection/BroadcastModule.java
@@ -1,7 +1,6 @@
package org.tasks.injection;
import com.todoroo.astrid.alarms.AlarmTaskRepeatListener;
-import com.todoroo.astrid.backup.BackupStartupReceiver;
import com.todoroo.astrid.calls.PhoneStateChangedReceiver;
import com.todoroo.astrid.core.CoreFilterExposer;
import com.todoroo.astrid.core.CustomFilterExposer;
@@ -20,32 +19,39 @@ import com.todoroo.astrid.timers.TimerFilterExposer;
import com.todoroo.astrid.timers.TimerTaskCompleteListener;
import com.todoroo.astrid.widget.TasksWidget;
-import org.tasks.scheduling.RefreshBroadcastReceiver;
+import org.tasks.receivers.BootCompletedReceiver;
+import org.tasks.receivers.FirstLaunchReceiver;
+import org.tasks.receivers.MyPackageReplacedReceiver;
+import org.tasks.receivers.PackageReplacedReceiver;
+import org.tasks.receivers.RefreshReceiver;
import dagger.Module;
@Module(addsTo = TasksModule.class,
injects = {
- RefreshBroadcastReceiver.class,
- TasksWidget.class,
- Notifications.class,
- GtasksCustomFilterCriteriaExposer.class,
- TagCustomFilterCriteriaExposer.class,
- GCalTaskCompleteListener.class,
- TimerTaskCompleteListener.class,
- RepeatTaskCompleteListener.class,
- AlarmTaskRepeatListener.class,
- GtasksStartupReceiver.class,
- PhoneStateChangedReceiver.class,
- ShowNotificationReceiver.class,
- CoreFilterExposer.class,
- TimerFilterExposer.class,
- CustomFilterExposer.class,
- GtasksFilterExposer.class,
- TagFilterExposer.class,
- BackupStartupReceiver.class,
- CalendarAlarmReceiver.class,
- CalendarStartupReceiver.class
-})
+ TasksWidget.class,
+ Notifications.class,
+ GtasksCustomFilterCriteriaExposer.class,
+ TagCustomFilterCriteriaExposer.class,
+ GCalTaskCompleteListener.class,
+ TimerTaskCompleteListener.class,
+ RepeatTaskCompleteListener.class,
+ AlarmTaskRepeatListener.class,
+ GtasksStartupReceiver.class,
+ PhoneStateChangedReceiver.class,
+ ShowNotificationReceiver.class,
+ CoreFilterExposer.class,
+ TimerFilterExposer.class,
+ CustomFilterExposer.class,
+ GtasksFilterExposer.class,
+ TagFilterExposer.class,
+ CalendarAlarmReceiver.class,
+ CalendarStartupReceiver.class,
+ BootCompletedReceiver.class,
+ FirstLaunchReceiver.class,
+ MyPackageReplacedReceiver.class,
+ PackageReplacedReceiver.class,
+ RefreshReceiver.class
+ })
public class BroadcastModule {
}
diff --git a/src/main/java/org/tasks/injection/InjectingIntentService.java b/src/main/java/org/tasks/injection/InjectingIntentService.java
new file mode 100644
index 000000000..d200b64e8
--- /dev/null
+++ b/src/main/java/org/tasks/injection/InjectingIntentService.java
@@ -0,0 +1,19 @@
+package org.tasks.injection;
+
+import android.app.IntentService;
+import android.content.Intent;
+
+public class InjectingIntentService extends IntentService {
+
+ public InjectingIntentService(String name) {
+ super(name);
+ }
+
+ @Override
+ protected void onHandleIntent(Intent intent) {
+ ((Injector) getApplication())
+ .getObjectGraph()
+ .plus(new IntentServiceModule())
+ .inject(this);
+ }
+}
diff --git a/src/main/java/org/tasks/injection/IntentServiceModule.java b/src/main/java/org/tasks/injection/IntentServiceModule.java
new file mode 100644
index 000000000..2d9ca11d8
--- /dev/null
+++ b/src/main/java/org/tasks/injection/IntentServiceModule.java
@@ -0,0 +1,16 @@
+package org.tasks.injection;
+
+import org.tasks.scheduling.*;
+
+import dagger.Module;
+
+@Module(addsTo = TasksModule.class,
+ injects = {
+ AlarmSchedulingIntentService.class,
+ BackupIntentService.class,
+ MidnightRefreshService.class,
+ RefreshSchedulerIntentService.class,
+ ReminderSchedulerIntentService.class
+ })
+public class IntentServiceModule {
+}
diff --git a/src/main/java/org/tasks/injection/ServiceModule.java b/src/main/java/org/tasks/injection/ServiceModule.java
index 7d160c585..a80601e2d 100644
--- a/src/main/java/org/tasks/injection/ServiceModule.java
+++ b/src/main/java/org/tasks/injection/ServiceModule.java
@@ -1,8 +1,6 @@
package org.tasks.injection;
-import com.todoroo.astrid.backup.BackupService;
import com.todoroo.astrid.gtasks.GtasksBackgroundService;
-import com.todoroo.astrid.reminders.ReminderSchedulingService;
import com.todoroo.astrid.widget.WidgetUpdateService;
import org.tasks.widget.ScrollableWidgetUpdateService;
@@ -12,10 +10,8 @@ import dagger.Module;
@Module(addsTo = TasksModule.class,
injects = {
GtasksBackgroundService.class,
- ReminderSchedulingService.class,
ScrollableWidgetUpdateService.class,
- WidgetUpdateService.class,
- BackupService.class
+ WidgetUpdateService.class
})
public class ServiceModule {
}
diff --git a/src/main/java/org/tasks/receivers/BootCompletedReceiver.java b/src/main/java/org/tasks/receivers/BootCompletedReceiver.java
new file mode 100644
index 000000000..ad5ce4a2a
--- /dev/null
+++ b/src/main/java/org/tasks/receivers/BootCompletedReceiver.java
@@ -0,0 +1,27 @@
+package org.tasks.receivers;
+
+import android.content.Context;
+import android.content.Intent;
+
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+import org.tasks.injection.InjectingBroadcastReceiver;
+import org.tasks.scheduling.BackgroundScheduler;
+
+import javax.inject.Inject;
+
+public class BootCompletedReceiver extends InjectingBroadcastReceiver {
+
+ private static final Logger log = LoggerFactory.getLogger(BootCompletedReceiver.class);
+
+ @Inject BackgroundScheduler backgroundScheduler;
+
+ @Override
+ public void onReceive(Context context, Intent intent) {
+ super.onReceive(context, intent);
+
+ log.debug("onReceive(context, {})", intent);
+
+ backgroundScheduler.scheduleEverything();
+ }
+}
diff --git a/src/main/java/org/tasks/receivers/FirstLaunchReceiver.java b/src/main/java/org/tasks/receivers/FirstLaunchReceiver.java
new file mode 100644
index 000000000..63f2faf55
--- /dev/null
+++ b/src/main/java/org/tasks/receivers/FirstLaunchReceiver.java
@@ -0,0 +1,28 @@
+package org.tasks.receivers;
+
+import android.content.Context;
+import android.content.Intent;
+
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+import org.tasks.injection.InjectingBroadcastReceiver;
+import org.tasks.scheduling.BackgroundScheduler;
+
+import javax.inject.Inject;
+
+public class FirstLaunchReceiver extends InjectingBroadcastReceiver {
+
+ private static final Logger log = LoggerFactory.getLogger(FirstLaunchReceiver.class);
+
+ @Inject BackgroundScheduler backgroundScheduler;
+
+ @Override
+ public void onReceive(Context context, Intent intent) {
+ super.onReceive(context, intent);
+
+ log.debug("onReceive(context, {})", intent);
+
+ backgroundScheduler.scheduleBackupService();
+ backgroundScheduler.scheduleMidnightRefresh();
+ }
+}
diff --git a/src/main/java/org/tasks/receivers/MyPackageReplacedReceiver.java b/src/main/java/org/tasks/receivers/MyPackageReplacedReceiver.java
new file mode 100644
index 000000000..e1f9fff62
--- /dev/null
+++ b/src/main/java/org/tasks/receivers/MyPackageReplacedReceiver.java
@@ -0,0 +1,27 @@
+package org.tasks.receivers;
+
+import android.content.Context;
+import android.content.Intent;
+
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+import org.tasks.injection.InjectingBroadcastReceiver;
+import org.tasks.scheduling.BackgroundScheduler;
+
+import javax.inject.Inject;
+
+public class MyPackageReplacedReceiver extends InjectingBroadcastReceiver {
+
+ private static final Logger log = LoggerFactory.getLogger(MyPackageReplacedReceiver.class);
+
+ @Inject BackgroundScheduler backgroundScheduler;
+
+ @Override
+ public void onReceive(Context context, Intent intent) {
+ super.onReceive(context, intent);
+
+ log.debug("onReceive(context, {})", intent);
+
+ backgroundScheduler.scheduleEverything();
+ }
+}
diff --git a/src/main/java/org/tasks/receivers/PackageReplacedReceiver.java b/src/main/java/org/tasks/receivers/PackageReplacedReceiver.java
new file mode 100644
index 000000000..14edc639b
--- /dev/null
+++ b/src/main/java/org/tasks/receivers/PackageReplacedReceiver.java
@@ -0,0 +1,30 @@
+package org.tasks.receivers;
+
+import android.content.Context;
+import android.content.Intent;
+
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+import org.tasks.injection.InjectingBroadcastReceiver;
+import org.tasks.scheduling.BackgroundScheduler;
+
+import javax.inject.Inject;
+
+public class PackageReplacedReceiver extends InjectingBroadcastReceiver {
+
+ private static final Logger log = LoggerFactory.getLogger(PackageReplacedReceiver.class);
+
+ @Inject BackgroundScheduler backgroundScheduler;
+
+ @Override
+ public void onReceive(Context context, Intent intent) {
+ super.onReceive(context, intent);
+
+ if (intent.getAction().equals(Intent.ACTION_PACKAGE_REPLACED) && context.getPackageName().equals(intent.getData().getSchemeSpecificPart())) {
+ log.debug("onReceive(context, {})", intent);
+ backgroundScheduler.scheduleEverything();
+ } else {
+ log.debug("ignoring {}", intent);
+ }
+ }
+}
diff --git a/src/main/java/org/tasks/scheduling/RefreshBroadcastReceiver.java b/src/main/java/org/tasks/receivers/RefreshReceiver.java
similarity index 51%
rename from src/main/java/org/tasks/scheduling/RefreshBroadcastReceiver.java
rename to src/main/java/org/tasks/receivers/RefreshReceiver.java
index b15ea525e..69792489a 100644
--- a/src/main/java/org/tasks/scheduling/RefreshBroadcastReceiver.java
+++ b/src/main/java/org/tasks/receivers/RefreshReceiver.java
@@ -1,14 +1,18 @@
-package org.tasks.scheduling;
+package org.tasks.receivers;
import android.content.Context;
import android.content.Intent;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
import org.tasks.Broadcaster;
import org.tasks.injection.InjectingBroadcastReceiver;
import javax.inject.Inject;
-public class RefreshBroadcastReceiver extends InjectingBroadcastReceiver {
+public class RefreshReceiver extends InjectingBroadcastReceiver {
+
+ private static final Logger log = LoggerFactory.getLogger(RefreshReceiver.class);
@Inject Broadcaster broadcaster;
@@ -16,7 +20,8 @@ public class RefreshBroadcastReceiver extends InjectingBroadcastReceiver {
public void onReceive(Context context, Intent intent) {
super.onReceive(context, intent);
- broadcaster.taskListUpdated();
- broadcaster.filterListUpdated();
+ log.debug("onReceive(context, {})", intent);
+
+ broadcaster.refresh();
}
}
diff --git a/src/main/java/org/tasks/scheduling/AlarmSchedulingIntentService.java b/src/main/java/org/tasks/scheduling/AlarmSchedulingIntentService.java
new file mode 100644
index 000000000..73ced8ee6
--- /dev/null
+++ b/src/main/java/org/tasks/scheduling/AlarmSchedulingIntentService.java
@@ -0,0 +1,31 @@
+package org.tasks.scheduling;
+
+import android.content.Intent;
+
+import com.todoroo.astrid.alarms.AlarmService;
+
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+import org.tasks.injection.InjectingIntentService;
+
+import javax.inject.Inject;
+
+public class AlarmSchedulingIntentService extends InjectingIntentService {
+
+ private static final Logger log = LoggerFactory.getLogger(AlarmSchedulingIntentService.class);
+
+ @Inject AlarmService alarmService;
+
+ public AlarmSchedulingIntentService() {
+ super(AlarmSchedulingIntentService.class.getSimpleName());
+ }
+
+ @Override
+ protected void onHandleIntent(Intent intent) {
+ super.onHandleIntent(intent);
+
+ log.debug("onHandleIntent({})", intent);
+
+ alarmService.scheduleAllAlarms();
+ }
+}
diff --git a/src/main/java/org/tasks/scheduling/BackgroundScheduler.java b/src/main/java/org/tasks/scheduling/BackgroundScheduler.java
new file mode 100644
index 000000000..1fb7d88c0
--- /dev/null
+++ b/src/main/java/org/tasks/scheduling/BackgroundScheduler.java
@@ -0,0 +1,33 @@
+package org.tasks.scheduling;
+
+import android.content.Context;
+import android.content.Intent;
+
+import org.tasks.injection.ForApplication;
+
+import javax.inject.Inject;
+
+public class BackgroundScheduler {
+ private Context context;
+
+ @Inject
+ public BackgroundScheduler(@ForApplication Context context) {
+ this.context = context;
+ }
+
+ public void scheduleEverything() {
+ context.startService(new Intent(context, RefreshSchedulerIntentService.class));
+ context.startService(new Intent(context, AlarmSchedulingIntentService.class));
+ context.startService(new Intent(context, ReminderSchedulerIntentService.class));
+ scheduleBackupService();
+ scheduleMidnightRefresh();
+ }
+
+ public void scheduleBackupService() {
+ context.startService(new Intent(context, BackupIntentService.class));
+ }
+
+ public void scheduleMidnightRefresh() {
+ context.startService(new Intent(context, MidnightRefreshService.class));
+ }
+}
diff --git a/src/main/java/com/todoroo/astrid/backup/BackupService.java b/src/main/java/org/tasks/scheduling/BackupIntentService.java
similarity index 59%
rename from src/main/java/com/todoroo/astrid/backup/BackupService.java
rename to src/main/java/org/tasks/scheduling/BackupIntentService.java
index 24f29e74a..9fb4e68e5 100644
--- a/src/main/java/com/todoroo/astrid/backup/BackupService.java
+++ b/src/main/java/org/tasks/scheduling/BackupIntentService.java
@@ -1,23 +1,13 @@
-/**
- * Copyright (c) 2012 Todoroo Inc
- *
- * See the file "LICENSE" for the full license governing this code.
- */
-package com.todoroo.astrid.backup;
-
-import android.app.AlarmManager;
-import android.app.PendingIntent;
+package org.tasks.scheduling;
+
import android.content.Context;
-import android.content.Intent;
-import android.os.IBinder;
-import com.todoroo.andlib.service.ContextManager;
-import com.todoroo.andlib.utility.DateUtilities;
+import com.todoroo.astrid.backup.BackupConstants;
+import com.todoroo.astrid.backup.BackupPreferences;
+import com.todoroo.astrid.backup.TasksXmlExporter;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
-import org.tasks.R;
-import org.tasks.injection.InjectingService;
import org.tasks.preferences.Preferences;
import java.io.File;
@@ -27,44 +17,28 @@ import java.util.Comparator;
import javax.inject.Inject;
-/**
- * Inspired heavily by SynchronizationService
- */
-public class BackupService extends InjectingService {
-
- private static final Logger log = LoggerFactory.getLogger(BackupService.class);
+public class BackupIntentService extends MidnightIntentService {
- // --- constants for backup
+ private static final Logger log = LoggerFactory.getLogger(BackupIntentService.class);
- /**
- * when after phone starts to start first back up
- */
- private static final long BACKUP_OFFSET = 5 * 60 * 1000L;
-
- /**
- * how often to back up
- */
- private static final long BACKUP_INTERVAL = AlarmManager.INTERVAL_DAY;
- public static final String BACKUP_ACTION = "backup"; //$NON-NLS-1$
public static final String BACKUP_FILE_NAME_REGEX = "auto\\.[-\\d]+\\.xml"; //$NON-NLS-1$
private static final int DAYS_TO_KEEP_BACKUP = 7;
@Inject TasksXmlExporter xmlExporter;
@Inject Preferences preferences;
+ public BackupIntentService() {
+ super(BackupIntentService.class.getSimpleName());
+ }
+
@Override
- public IBinder onBind(Intent intent) {
- return null;
+ void run() {
+ startBackup(this);
}
@Override
- public void onStart(Intent intent, int startId) {
- try {
- ContextManager.setContext(this);
- startBackup(this);
- } catch (Exception e) {
- log.error(e.getMessage(), e);
- }
+ String getLastRunPreference() {
+ return BackupPreferences.PREF_BACKUP_LAST_DATE;
}
/**
@@ -81,43 +55,20 @@ public class BackupService extends InjectingService {
return;
}
try {
- if (!preferences.getBoolean(R.string.backup_BPr_auto_key, true)) {
- return;
- }
-
- try {
- deleteOldBackups();
- } catch (Exception e) {
- log.error(e.getMessage(), e);
- }
+ deleteOldBackups();
+ } catch (Exception e) {
+ log.error(e.getMessage(), e);
+ }
+ try {
xmlExporter.exportTasks(context, TasksXmlExporter.ExportType.EXPORT_TYPE_SERVICE,
backupDirectorySetting.getBackupDirectory());
-
} catch (Exception e) {
log.error(e.getMessage(), e);
preferences.setString(BackupPreferences.PREF_BACKUP_LAST_ERROR, e.toString());
}
}
- public static void scheduleService(Preferences preferences, Context context) {
- AlarmManager am = (AlarmManager) context.getSystemService(Context.ALARM_SERVICE);
- PendingIntent pendingIntent = PendingIntent.getService(context, 0,
- createAlarmIntent(context), PendingIntent.FLAG_UPDATE_CURRENT);
- am.cancel(pendingIntent);
- if (!preferences.getBoolean(R.string.backup_BPr_auto_key, true)) {
- return;
- }
- am.setInexactRepeating(AlarmManager.RTC, DateUtilities.now() + BACKUP_OFFSET,
- BACKUP_INTERVAL, pendingIntent);
- }
-
- private static Intent createAlarmIntent(Context context) {
- Intent intent = new Intent(context, BackupService.class);
- intent.setAction(BACKUP_ACTION);
- return intent;
- }
-
private void deleteOldBackups() {
FileFilter backupFileFilter = new FileFilter() {
@Override
diff --git a/src/main/java/org/tasks/scheduling/MidnightIntentService.java b/src/main/java/org/tasks/scheduling/MidnightIntentService.java
new file mode 100644
index 000000000..56cd78907
--- /dev/null
+++ b/src/main/java/org/tasks/scheduling/MidnightIntentService.java
@@ -0,0 +1,60 @@
+package org.tasks.scheduling;
+
+import android.app.AlarmManager;
+import android.app.PendingIntent;
+import android.content.Context;
+import android.content.Intent;
+
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+import org.tasks.injection.InjectingIntentService;
+import org.tasks.preferences.Preferences;
+
+import javax.inject.Inject;
+
+import static java.util.concurrent.TimeUnit.SECONDS;
+import static org.tasks.date.DateTimeUtils.currentTimeMillis;
+import static org.tasks.date.DateTimeUtils.newDateTime;
+
+public abstract class MidnightIntentService extends InjectingIntentService {
+
+ private static final Logger log = LoggerFactory.getLogger(MidnightIntentService.class);
+
+ private static final long PADDING = SECONDS.toMillis(1);
+
+ @Inject Preferences preferences;
+
+ public MidnightIntentService(String name) {
+ super(name);
+ }
+
+ @Override
+ protected void onHandleIntent(Intent intent) {
+ super.onHandleIntent(intent);
+
+ long lastRun = preferences.getLong(getLastRunPreference(), 0);
+ long nextRun = nextMidnight(lastRun);
+ long now = currentTimeMillis();
+
+ if (nextRun <= now) {
+ nextRun = nextMidnight(now);
+ log.debug("running now [nextRun={}]", newDateTime(nextRun));
+ preferences.setLong(getLastRunPreference(), now);
+ run();
+ } else {
+ log.debug("will run at {} [lastRun={}]", newDateTime(nextRun), newDateTime(lastRun));
+ }
+
+ AlarmManager alarmManager = (AlarmManager) getSystemService(Context.ALARM_SERVICE);
+ PendingIntent pendingIntent = PendingIntent.getService(this, 0, new Intent(this, this.getClass()), PendingIntent.FLAG_UPDATE_CURRENT);
+ alarmManager.set(AlarmManager.RTC, nextRun + PADDING, pendingIntent);
+ }
+
+ private static long nextMidnight(long timestamp) {
+ return newDateTime(timestamp).withMillisOfDay(0).plusDays(1).getMillis();
+ }
+
+ abstract void run();
+
+ abstract String getLastRunPreference();
+}
diff --git a/src/main/java/org/tasks/scheduling/MidnightRefreshService.java b/src/main/java/org/tasks/scheduling/MidnightRefreshService.java
new file mode 100644
index 000000000..242400a24
--- /dev/null
+++ b/src/main/java/org/tasks/scheduling/MidnightRefreshService.java
@@ -0,0 +1,24 @@
+package org.tasks.scheduling;
+
+import org.tasks.Broadcaster;
+
+import javax.inject.Inject;
+
+public class MidnightRefreshService extends MidnightIntentService {
+
+ @Inject Broadcaster broadcaster;
+
+ public MidnightRefreshService() {
+ super(MidnightRefreshService.class.getSimpleName());
+ }
+
+ @Override
+ void run() {
+ broadcaster.refresh();
+ }
+
+ @Override
+ String getLastRunPreference() {
+ return "midnightRefreshDate";
+ }
+}
diff --git a/src/main/java/org/tasks/scheduling/RefreshScheduler.java b/src/main/java/org/tasks/scheduling/RefreshScheduler.java
index 1ed68e243..eb991dd95 100644
--- a/src/main/java/org/tasks/scheduling/RefreshScheduler.java
+++ b/src/main/java/org/tasks/scheduling/RefreshScheduler.java
@@ -13,6 +13,7 @@ import com.todoroo.astrid.dao.TaskDao;
import com.todoroo.astrid.data.Task;
import org.tasks.injection.ForApplication;
+import org.tasks.receivers.RefreshReceiver;
import javax.inject.Inject;
import javax.inject.Singleton;
@@ -38,7 +39,7 @@ public class RefreshScheduler {
this.context = context;
}
- public void scheduleAllAlarms() {
+ public void scheduleApplicationRefreshes() {
TodorooCursor cursor = getTasks();
try {
for (cursor.moveToFirst(); !cursor.isAfterLast(); cursor.moveToNext()) {
@@ -68,7 +69,7 @@ public class RefreshScheduler {
}
dueDate += 1000; // this is ghetto
- Intent intent = new Intent(context, RefreshBroadcastReceiver.class);
+ Intent intent = new Intent(context, RefreshReceiver.class);
intent.setAction(Long.toString(dueDate));
AlarmManager am = (AlarmManager) context.getSystemService(Context.ALARM_SERVICE);
PendingIntent pendingIntent = PendingIntent.getBroadcast(context, 0, intent, FLAG_UPDATE_CURRENT);
diff --git a/src/main/java/org/tasks/scheduling/RefreshSchedulerIntentService.java b/src/main/java/org/tasks/scheduling/RefreshSchedulerIntentService.java
new file mode 100644
index 000000000..2a264627c
--- /dev/null
+++ b/src/main/java/org/tasks/scheduling/RefreshSchedulerIntentService.java
@@ -0,0 +1,29 @@
+package org.tasks.scheduling;
+
+import android.content.Intent;
+
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+import org.tasks.injection.InjectingIntentService;
+
+import javax.inject.Inject;
+
+public class RefreshSchedulerIntentService extends InjectingIntentService {
+
+ private static final Logger log = LoggerFactory.getLogger(RefreshSchedulerIntentService.class);
+
+ @Inject RefreshScheduler refreshScheduler;
+
+ public RefreshSchedulerIntentService() {
+ super(RefreshSchedulerIntentService.class.getSimpleName());
+ }
+
+ @Override
+ protected void onHandleIntent(Intent intent) {
+ super.onHandleIntent(intent);
+
+ log.debug("onHandleIntent({})", intent);
+
+ refreshScheduler.scheduleApplicationRefreshes();
+ }
+}
diff --git a/src/main/java/org/tasks/scheduling/ReminderSchedulerIntentService.java b/src/main/java/org/tasks/scheduling/ReminderSchedulerIntentService.java
new file mode 100644
index 000000000..dfaae6ae0
--- /dev/null
+++ b/src/main/java/org/tasks/scheduling/ReminderSchedulerIntentService.java
@@ -0,0 +1,33 @@
+package org.tasks.scheduling;
+
+import android.content.Intent;
+
+import com.todoroo.astrid.dao.TaskDao;
+import com.todoroo.astrid.reminders.ReminderService;
+
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+import org.tasks.injection.InjectingIntentService;
+
+import javax.inject.Inject;
+
+public class ReminderSchedulerIntentService extends InjectingIntentService {
+
+ private static final Logger log = LoggerFactory.getLogger(ReminderSchedulerIntentService.class);
+
+ @Inject ReminderService reminderService;
+ @Inject TaskDao taskDao;
+
+ public ReminderSchedulerIntentService() {
+ super(ReminderSchedulerIntentService.class.getSimpleName());
+ }
+
+ @Override
+ protected void onHandleIntent(Intent intent) {
+ super.onHandleIntent(intent);
+
+ log.debug("onHandleIntent({})", intent);
+
+ reminderService.scheduleAllAlarms(taskDao);
+ }
+}
diff --git a/src/main/java/org/tasks/sync/RecordSyncStatusCallback.java b/src/main/java/org/tasks/sync/RecordSyncStatusCallback.java
index 0acaa1dd6..7673733a6 100644
--- a/src/main/java/org/tasks/sync/RecordSyncStatusCallback.java
+++ b/src/main/java/org/tasks/sync/RecordSyncStatusCallback.java
@@ -28,7 +28,7 @@ public class RecordSyncStatusCallback implements SyncResultCallback {
public void finished() {
gtasksPreferenceService.stopOngoing();
if (broadcaster != null) {
- broadcaster.eventRefresh();
+ broadcaster.refresh();
}
}
}
diff --git a/src/main/res/layout/control_set_title.xml b/src/main/res/layout/control_set_title.xml
index 76ec4e02d..093a0ed0a 100644
--- a/src/main/res/layout/control_set_title.xml
+++ b/src/main/res/layout/control_set_title.xml
@@ -18,6 +18,7 @@
android:id="@+id/completeBox"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
+ android:layout_gravity="top"
android:paddingRight="@dimen/task_edit_drawable_padding"
android:paddingEnd="@dimen/task_edit_drawable_padding"
android:scaleType="center"
diff --git a/src/main/res/values-ar/strings.xml b/src/main/res/values-ar/strings.xml
index 4937f2f3f..28565d3b8 100644
--- a/src/main/res/values-ar/strings.xml
+++ b/src/main/res/values-ar/strings.xml
@@ -7,7 +7,6 @@
إضافة تعليق ...
الحالة
- الخيارات
الغي
اضغط لتعيين
لا يوجد لديك مهام! \n هل تريد أن تضيف شيئا؟
diff --git a/src/main/res/values-bg-rBG/strings.xml b/src/main/res/values-bg-rBG/strings.xml
index ef7846e82..51f77544a 100644
--- a/src/main/res/values-bg-rBG/strings.xml
+++ b/src/main/res/values-bg-rBG/strings.xml
@@ -19,10 +19,6 @@
Последно резервно копие:\n%s
Последното резервно копиране се провали
Никога не е правено резевно копиране!
- Опции
- Автоматично резервно копиране
- Автоматичното резервно копиране е изключено
- Резервно копиране ще се случва всеки ден
Импортиране на задачи
Експортиране на задачи
Няма задачи за експортиране
diff --git a/src/main/res/values-ca/strings.xml b/src/main/res/values-ca/strings.xml
index 5e059fd1d..f2d161548 100644
--- a/src/main/res/values-ca/strings.xml
+++ b/src/main/res/values-ca/strings.xml
@@ -23,10 +23,6 @@
Còpia de seguretat Fallida
Feu clic per veure l\'error
Encara sense Còpies!
- Opcions
- Còpies de seguretat automàtiques
- Còpies de seguretat automàtiques desactivades
- Còpies de seguretat diàries
Importa tasques
Exporta tasques
Sense tasques que exportar
diff --git a/src/main/res/values-cs/strings.xml b/src/main/res/values-cs/strings.xml
index f18e3c1a7..e254090ac 100644
--- a/src/main/res/values-cs/strings.xml
+++ b/src/main/res/values-cs/strings.xml
@@ -23,10 +23,6 @@
Předchozí zálohování selhalo
klikněte pro zobrazení chyby
Nikdy nezálohováno!
- Nastavení
- Automatické zálohování
- Automatické zálohování je zakázáno
- Zálohování se bude provádět denně
Importovat úkoly
Exportovat úkoly
Zálohovány %1$s do %2$s.
diff --git a/src/main/res/values-da/strings.xml b/src/main/res/values-da/strings.xml
index 0ae434c59..276c989f6 100644
--- a/src/main/res/values-da/strings.xml
+++ b/src/main/res/values-da/strings.xml
@@ -18,10 +18,6 @@
Seneste backup fejlede
(tryk for at vise fejl)
Har aldrig taget backup!
- Indstillinger
- Automatisk backup
- Automatisk backup deaktiveret
- Backup vil ske dagligt
Importér opgaver
Eksportér opgaver
Sikkerhedskopierede %1$s til %2$s.
diff --git a/src/main/res/values-de/strings.xml b/src/main/res/values-de/strings.xml
index c2076d88d..0669642eb 100644
--- a/src/main/res/values-de/strings.xml
+++ b/src/main/res/values-de/strings.xml
@@ -18,10 +18,6 @@
Letzte Datensicherung gescheitert
(Anklicken, um Fehler anzuzeigen)
Bisher keine Datensicherung erstellt!
- Optionen
- Automatische Backups
- Automatische Backups deaktiviert
- Backup täglich durchführen
Aufgaben importieren
Aufgaben exportieren
Gesichert von %1$s bis %2$s.
diff --git a/src/main/res/values-el/strings.xml b/src/main/res/values-el/strings.xml
index d0bc5e2c4..fabb3f8f5 100644
--- a/src/main/res/values-el/strings.xml
+++ b/src/main/res/values-el/strings.xml
@@ -18,10 +18,6 @@
Το τελευταίο αντίγραφο ασφαλείας απέτυχε
(πατήστε για να δείξετε σφάλμα)
Δεν έγινε ποτέ αντίγραφο ασφαλείας!
- Ρυθμίσεις
- Αυτόματα αντίγραφα ασφαλείας
- Αυτόματα αντίγραφα ασφαλείας απενεργοποιήθηκαν
- Aντίγραφα ασφαλείας θα παίρνονται καθημερινά
Εισαγωγή καθηκόντων
Εξαγωγή καθηκόντων
Αποθηκεύση ασφαλείας %1$s στο %2$s.
diff --git a/src/main/res/values-es/strings.xml b/src/main/res/values-es/strings.xml
index f3e935f7a..9ee9c3d25 100644
--- a/src/main/res/values-es/strings.xml
+++ b/src/main/res/values-es/strings.xml
@@ -23,10 +23,6 @@
La última copia de seguridad falló
(toque para visualizar los errores)
Nunca se hizo copia de seguridad!
- Opciones
- Copias de seguridad automáticas
- Copias de seguridad automáticas desactivadas
- La copia de seguridad se hará diariamente
Importar tareas
Exportar tareas
Respaldadas %1$s de %2$s.
diff --git a/src/main/res/values-fr/strings.xml b/src/main/res/values-fr/strings.xml
index 2b90288ac..c240059f2 100644
--- a/src/main/res/values-fr/strings.xml
+++ b/src/main/res/values-fr/strings.xml
@@ -23,9 +23,6 @@
La dernière sauvegarde a échoué
(appuyer pour afficher l\'erreur)
Aucune sauvegarde !
- Sauvegardes automatiques
- Sauvegardes automatiques désactivées
- Une sauvegarde sera effectuée quotidiennement.
Importer des tâches
Exporter des tâches
Sauvegardé %1$s dans %2$s.
diff --git a/src/main/res/values-it/strings.xml b/src/main/res/values-it/strings.xml
index 4447580f5..c55e434b8 100644
--- a/src/main/res/values-it/strings.xml
+++ b/src/main/res/values-it/strings.xml
@@ -23,10 +23,6 @@
Ultimo Backup Fallito
(clicca per visualizzare l\'errore)
Mai eseguito!
- Preferenze
- Backup automatici
- Backup Automatico Disabilitato
- I Backup verranno eseguiti giornalmente
Importa compiti
Esporta compiti
Backup di %1$s su %2$s eseguito.
diff --git a/src/main/res/values-iw/strings.xml b/src/main/res/values-iw/strings.xml
index ed8e4eabd..634942b86 100644
--- a/src/main/res/values-iw/strings.xml
+++ b/src/main/res/values-iw/strings.xml
@@ -23,10 +23,6 @@
הגיבוי האחרון נכשל
\"(טפח כדי להציג את השגיאה)\"
לא נעשו גיבויים מעולם!
- אפשרויות
- גיבויים אוטומטיים
- הגיבויים האוטומטיים הופסקו
- הגיבוי יתבצע מדי יום
ייבוא משימות
ייצוא משימות
בוצע גיבוי של %1$s אל %2$s.
diff --git a/src/main/res/values-ja/strings.xml b/src/main/res/values-ja/strings.xml
index f2a4ba3e6..cb4f7bcde 100644
--- a/src/main/res/values-ja/strings.xml
+++ b/src/main/res/values-ja/strings.xml
@@ -23,10 +23,6 @@
前回のバックアップが失敗しました
(タップでエラーを表示)
一度もバックアップされていません!
- オプション
- 自動的なバックアップ
- 自動的なバックアップは無効です
- バックアップは毎日行われます
タスクのインポート
タスクのエクスポート
%1$s を %2$s にバックアップしました。
diff --git a/src/main/res/values-ko/strings.xml b/src/main/res/values-ko/strings.xml
index 47ea0ae31..c850b58bd 100644
--- a/src/main/res/values-ko/strings.xml
+++ b/src/main/res/values-ko/strings.xml
@@ -23,10 +23,6 @@
마지막 백업 실패함
(오류 내용을 보려면 누르세요)
백업한 적이 없습니다!
- 설정
- 자동 백업
- 자동으로 백업하지 않습니다
- 매일 백업합니다
일정 가져오기
일정 내보내기
%1$s 를 %2$s 로 백업함.
diff --git a/src/main/res/values-nb/strings.xml b/src/main/res/values-nb/strings.xml
index 4c1e0eeaf..51663ab73 100644
--- a/src/main/res/values-nb/strings.xml
+++ b/src/main/res/values-nb/strings.xml
@@ -12,10 +12,6 @@
Siste sikkerhetskopiering mislyktes
(klikk for å vise feil)
Sikkerhetskopi aldri utført!
- Alternativer
- Automatisk sikkerhetskopiering
- Automatisk sikkerhetskopiering deaktivert
- Sikkerhetskopiering vil skje daglig
Importer oppgaver
Eksporter oppgaver
Backup ferdig %1$s av %2$s.
diff --git a/src/main/res/values-nl/strings.xml b/src/main/res/values-nl/strings.xml
index 1d820d1f7..f0841d290 100644
--- a/src/main/res/values-nl/strings.xml
+++ b/src/main/res/values-nl/strings.xml
@@ -22,10 +22,6 @@
Laatste back-up mislukt
(tik om foutmelding te zien)
Nooit eerder back-up van gemaakt!
- Opties
- Automatische back-ups
- Automatische back-ups uitgeschakeld
- Back-up dagelijks uitvoeren
Taken importeren
Taken exporteren
Back-up gemaakt van %1$s naar %2$s.
diff --git a/src/main/res/values-pl/strings.xml b/src/main/res/values-pl/strings.xml
index 3a23905d3..b788f4162 100644
--- a/src/main/res/values-pl/strings.xml
+++ b/src/main/res/values-pl/strings.xml
@@ -20,10 +20,6 @@
Błąd zapisu ostatniej kopii
(puknij, aby zobaczyć błąd)
Kopia zapasowa nigdy nie wykonana!
- Opcje
- Automatyczne kopie zapasowe
- Automatyczne kopie zapasowe wyłączone
- Kopia zapasowa będzie wykonywana codziennie
Importuj zadania
Eksportuj zadania
Zapisano %1$s do %2$s.
diff --git a/src/main/res/values-pt-rBR/strings.xml b/src/main/res/values-pt-rBR/strings.xml
index fbc1e59ea..80ab62b6c 100644
--- a/src/main/res/values-pt-rBR/strings.xml
+++ b/src/main/res/values-pt-rBR/strings.xml
@@ -22,10 +22,6 @@
O último backup falhou
(toque para exibir o erro)
O Backup nunca foi executado!
- Opções
- Backups automáticos
- Backups automáticos desativados
- O Backup ocorrerá diariamente
Importar tarefas
Exportar tarefas
Backups feitos: de %1$s para %2$s.
diff --git a/src/main/res/values-pt/strings.xml b/src/main/res/values-pt/strings.xml
index 29add1716..4089a379a 100644
--- a/src/main/res/values-pt/strings.xml
+++ b/src/main/res/values-pt/strings.xml
@@ -22,10 +22,6 @@
Último backup falhou
(clique para ver o erro)
Nunca fez um backup!
- Opções
- Backups automáticos
- Backups automáticos desativados
- Backups diários
Importar tarefas
Exportar tarefas
Backup de %1$s para %2$s.
diff --git a/src/main/res/values-ru/strings.xml b/src/main/res/values-ru/strings.xml
index e1779c0b2..4257b8205 100644
--- a/src/main/res/values-ru/strings.xml
+++ b/src/main/res/values-ru/strings.xml
@@ -23,10 +23,6 @@
Резервирование не удалось
(нажмите для просмотра ошибки)
Резервное копирование ещё не совершалось!
- Параметры
- Резервное копирование: автоматическое
- Резервное копирование: отключено
- Резервное копирование будет производиться ежедневно
Импортировать задачи
Экспортировать задачи
Восстановлено %1$s в %2$s.
diff --git a/src/main/res/values-sl-rSI/strings.xml b/src/main/res/values-sl-rSI/strings.xml
index d6e5c1eb9..b4dccd0b0 100644
--- a/src/main/res/values-sl-rSI/strings.xml
+++ b/src/main/res/values-sl-rSI/strings.xml
@@ -22,10 +22,6 @@
Najnovejša varnostna kopija neuspešna
(hitri dotik pokaže napako)
Varnostna kopija še NIkoli SHRANJENA!
- Možnosti
- Samodejne varnostne kopije
- Samodejne varnostne kopije onemogočene
- Varnostna kopija bo shranjena vsak dan
Uvozi opravke
Izvozi opravke
Varnostna kopija za %1$s shranjena v %2$s.
diff --git a/src/main/res/values-sv/strings.xml b/src/main/res/values-sv/strings.xml
index 34ebf24a9..ad8aa06f7 100644
--- a/src/main/res/values-sv/strings.xml
+++ b/src/main/res/values-sv/strings.xml
@@ -19,10 +19,6 @@
Senaste säkerhetskopieringen misslyckades
(klicka för att se felet)
Aldrig säkerhetskopierat!
- Alternativ
- Automatisk säkerhetskopiering
- Automatisk säkerhetskopiering avaktiverad
- Säkerhetskopiering kommer att ske dagligen
Importera uppgifter
Exportera uppgifter
Säkerhetskopierade %1$s till %2$s.
diff --git a/src/main/res/values-th/strings.xml b/src/main/res/values-th/strings.xml
index 1eaf1f416..83e6c06e2 100644
--- a/src/main/res/values-th/strings.xml
+++ b/src/main/res/values-th/strings.xml
@@ -14,8 +14,6 @@
สำรองข้อมูล
สถานะ
(แตะเพื่อแสดงข้อผิดพลาด)
- ตัวเลือก
- จะทำการสำรองข้อมูลทุกวัน
กำลังส่งออก...
กำลังนำเข้า...
กำลังอ่านแผนงาน %d...
diff --git a/src/main/res/values-tr/strings.xml b/src/main/res/values-tr/strings.xml
index e919c5a75..b1f12126f 100644
--- a/src/main/res/values-tr/strings.xml
+++ b/src/main/res/values-tr/strings.xml
@@ -20,10 +20,6 @@
Son Yedekleme Başarısız
(hatayı görmek için dokunun)
Hiç Yedeklenmemiş!
- Seçenekler
- Kendiliğinden Yedeklemeler
- Kendiliğinden Yedekleme Etkisiz
- Günlük yedekleme yapılacak
Görevleri İçe Aktar
Görevleri Dışa Aktar
%1$s şuraya yedeklendi: %2$s.
diff --git a/src/main/res/values-uk/strings.xml b/src/main/res/values-uk/strings.xml
index 82c27cde4..74a40bb2c 100644
--- a/src/main/res/values-uk/strings.xml
+++ b/src/main/res/values-uk/strings.xml
@@ -23,10 +23,6 @@
Створення останньої резервної копії не вдалось
(торкніться щоб подивитись помилку)
Резервна копія не створена!
- Налаштування
- Автоматичне резервне копіювання
- Автоматичне резервне копіювання заборонене
- Резервне копіювання буде здійснюватись щоденно
Імпортувати завдання
Експорт завдань
Резервні копії %1$s для %2$s.
diff --git a/src/main/res/values-v12/bools.xml b/src/main/res/values-v12/bools.xml
new file mode 100644
index 000000000..bef2631ec
--- /dev/null
+++ b/src/main/res/values-v12/bools.xml
@@ -0,0 +1,5 @@
+
+
+ false
+ true
+
\ No newline at end of file
diff --git a/src/main/res/values-zh-rCN/strings.xml b/src/main/res/values-zh-rCN/strings.xml
index ca7a93cd0..bf3119e97 100644
--- a/src/main/res/values-zh-rCN/strings.xml
+++ b/src/main/res/values-zh-rCN/strings.xml
@@ -23,10 +23,6 @@
上次备份失败
(点击查看错误)
从未备份!
- 选项
- 自动备份
- 自动备份已停用
- 备份每天执行
导入任务
导出任务
已将 %1$s 备份至 %2$s。
diff --git a/src/main/res/values-zh-rTW/strings.xml b/src/main/res/values-zh-rTW/strings.xml
index 44d9d3232..dc1db7f0b 100644
--- a/src/main/res/values-zh-rTW/strings.xml
+++ b/src/main/res/values-zh-rTW/strings.xml
@@ -23,10 +23,6 @@
上次備份失敗
(點選查看錯誤)
從未備份
- 選項
- 自動備份
- 停用自動備份
- 備份將每天執行
匯入工作
匯出工作
備份 %1$s 至 %2$s.
diff --git a/src/main/res/values/bools.xml b/src/main/res/values/bools.xml
new file mode 100644
index 000000000..8afff434b
--- /dev/null
+++ b/src/main/res/values/bools.xml
@@ -0,0 +1,5 @@
+
+
+ true
+ false
+
\ No newline at end of file
diff --git a/src/main/res/values/keys.xml b/src/main/res/values/keys.xml
index c678f5b67..426c598da 100644
--- a/src/main/res/values/keys.xml
+++ b/src/main/res/values/keys.xml
@@ -228,8 +228,6 @@
backup_status
-
- backup
default_calendar_id
diff --git a/src/main/res/values/strings-backup.xml b/src/main/res/values/strings-backup.xml
index 273234cb9..80f3134d0 100644
--- a/src/main/res/values/strings-backup.xml
+++ b/src/main/res/values/strings-backup.xml
@@ -20,16 +20,6 @@
Never backed up!
-
- Options
-
-
- Automatic backups
-
- Automatic backups disabled
-
- Backup will occur daily
-
Import tasks
diff --git a/src/main/res/xml/preferences_backup.xml b/src/main/res/xml/preferences_backup.xml
index 2217b2f5f..48cc77fea 100644
--- a/src/main/res/xml/preferences_backup.xml
+++ b/src/main/res/xml/preferences_backup.xml
@@ -17,16 +17,6 @@
android:gravity="center"/>
-
-
-
-
-
-