From 972b19fae0355bb28f1c9574bc5b429f4b62c09a Mon Sep 17 00:00:00 2001 From: Alex Baker Date: Tue, 16 Dec 2014 15:40:59 -0600 Subject: [PATCH] Working on background services * Backup intent service runs at midnight - closes #109 * Broadcast refresh at midnight - closes #100 * Task list listens for refreshes - see #189 * Reschedule everything on app upgrade --- .../astrid/backup/BackupServiceTests.java | 188 ------------------ .../java/org/tasks/injection/TestModule.java | 2 +- .../tasks/scheduling/BackupServiceTests.java | 133 +++++++++++++ src/main/AndroidManifest.xml | 59 ++++-- src/main/assets/logback.xml | 2 +- .../astrid/activity/TaskListActivity.java | 19 ++ .../astrid/activity/TaskListFragment.java | 6 +- .../todoroo/astrid/adapter/FilterAdapter.java | 2 +- .../astrid/api/AstridApiConstants.java | 11 +- .../astrid/backup/BackupPreferences.java | 23 +-- .../astrid/backup/BackupStartupReceiver.java | 30 --- .../astrid/backup/TasksXmlExporter.java | 16 +- .../java/com/todoroo/astrid/dao/TaskDao.java | 2 +- .../astrid/helper/SyncActionHelper.java | 4 +- .../reminders/ReminderSchedulingService.java | 74 ------- .../reminders/ReminderStartupReceiver.java | 32 --- .../astrid/service/StartupService.java | 16 +- .../todoroo/astrid/service/TaskService.java | 2 +- .../todoroo/astrid/widget/TasksWidget.java | 4 +- src/main/java/org/tasks/Broadcaster.java | 15 +- .../java/org/tasks/date/DateTimeUtils.java | 5 + .../org/tasks/injection/BroadcastModule.java | 52 ++--- .../injection/InjectingIntentService.java | 19 ++ .../tasks/injection/IntentServiceModule.java | 16 ++ .../org/tasks/injection/ServiceModule.java | 6 +- .../receivers/BootCompletedReceiver.java | 27 +++ .../tasks/receivers/FirstLaunchReceiver.java | 28 +++ .../receivers/MyPackageReplacedReceiver.java | 27 +++ .../receivers/PackageReplacedReceiver.java | 30 +++ .../RefreshReceiver.java} | 13 +- .../AlarmSchedulingIntentService.java | 31 +++ .../tasks/scheduling/BackgroundScheduler.java | 33 +++ .../scheduling/BackupIntentService.java} | 89 ++------- .../scheduling/MidnightIntentService.java | 60 ++++++ .../scheduling/MidnightRefreshService.java | 24 +++ .../tasks/scheduling/RefreshScheduler.java | 5 +- .../RefreshSchedulerIntentService.java | 29 +++ .../ReminderSchedulerIntentService.java | 33 +++ .../tasks/sync/RecordSyncStatusCallback.java | 2 +- src/main/res/layout/control_set_title.xml | 1 + src/main/res/values-ar/strings.xml | 1 - src/main/res/values-bg-rBG/strings.xml | 4 - src/main/res/values-ca/strings.xml | 4 - src/main/res/values-cs/strings.xml | 4 - src/main/res/values-da/strings.xml | 4 - src/main/res/values-de/strings.xml | 4 - src/main/res/values-el/strings.xml | 4 - src/main/res/values-es/strings.xml | 4 - src/main/res/values-fr/strings.xml | 3 - src/main/res/values-it/strings.xml | 4 - src/main/res/values-iw/strings.xml | 4 - src/main/res/values-ja/strings.xml | 4 - src/main/res/values-ko/strings.xml | 4 - src/main/res/values-nb/strings.xml | 4 - src/main/res/values-nl/strings.xml | 4 - src/main/res/values-pl/strings.xml | 4 - src/main/res/values-pt-rBR/strings.xml | 4 - src/main/res/values-pt/strings.xml | 4 - src/main/res/values-ru/strings.xml | 4 - src/main/res/values-sl-rSI/strings.xml | 4 - src/main/res/values-sv/strings.xml | 4 - src/main/res/values-th/strings.xml | 2 - src/main/res/values-tr/strings.xml | 4 - src/main/res/values-uk/strings.xml | 4 - src/main/res/values-v12/bools.xml | 5 + src/main/res/values-zh-rCN/strings.xml | 4 - src/main/res/values-zh-rTW/strings.xml | 4 - src/main/res/values/bools.xml | 5 + src/main/res/values/keys.xml | 2 - src/main/res/values/strings-backup.xml | 10 - src/main/res/xml/preferences_backup.xml | 10 - 71 files changed, 670 insertions(+), 630 deletions(-) delete mode 100644 src/androidTest/java/com/todoroo/astrid/backup/BackupServiceTests.java create mode 100644 src/androidTest/java/org/tasks/scheduling/BackupServiceTests.java delete mode 100644 src/main/java/com/todoroo/astrid/backup/BackupStartupReceiver.java delete mode 100644 src/main/java/com/todoroo/astrid/reminders/ReminderSchedulingService.java delete mode 100644 src/main/java/com/todoroo/astrid/reminders/ReminderStartupReceiver.java create mode 100644 src/main/java/org/tasks/injection/InjectingIntentService.java create mode 100644 src/main/java/org/tasks/injection/IntentServiceModule.java create mode 100644 src/main/java/org/tasks/receivers/BootCompletedReceiver.java create mode 100644 src/main/java/org/tasks/receivers/FirstLaunchReceiver.java create mode 100644 src/main/java/org/tasks/receivers/MyPackageReplacedReceiver.java create mode 100644 src/main/java/org/tasks/receivers/PackageReplacedReceiver.java rename src/main/java/org/tasks/{scheduling/RefreshBroadcastReceiver.java => receivers/RefreshReceiver.java} (51%) create mode 100644 src/main/java/org/tasks/scheduling/AlarmSchedulingIntentService.java create mode 100644 src/main/java/org/tasks/scheduling/BackgroundScheduler.java rename src/main/java/{com/todoroo/astrid/backup/BackupService.java => org/tasks/scheduling/BackupIntentService.java} (59%) create mode 100644 src/main/java/org/tasks/scheduling/MidnightIntentService.java create mode 100644 src/main/java/org/tasks/scheduling/MidnightRefreshService.java create mode 100644 src/main/java/org/tasks/scheduling/RefreshSchedulerIntentService.java create mode 100644 src/main/java/org/tasks/scheduling/ReminderSchedulerIntentService.java create mode 100644 src/main/res/values-v12/bools.xml create mode 100644 src/main/res/values/bools.xml 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"/> - - - - - -