diff --git a/src/androidTest/java/org/tasks/scheduling/BackupServiceTests.java b/src/androidTest/java/org/tasks/scheduling/BackupServiceTests.java index 958b3359b..d9a00778f 100644 --- a/src/androidTest/java/org/tasks/scheduling/BackupServiceTests.java +++ b/src/androidTest/java/org/tasks/scheduling/BackupServiceTests.java @@ -11,6 +11,7 @@ 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; @@ -32,12 +33,6 @@ public class BackupServiceTests extends DatabaseTestCase { @Inject TaskDao taskDao; @Inject Preferences preferences; - BackupIntentService.BackupDirectorySetting setting = new BackupIntentService.BackupDirectorySetting() { - public File getBackupDirectory() { - return temporaryDirectory; - } - }; - @Override protected void setUp() { super.setUp(); @@ -53,6 +48,8 @@ public class BackupServiceTests extends DatabaseTestCase { if (!(temporaryDirectory.mkdir())) throw new RuntimeException("Could not create temp directory: " + temporaryDirectory.getAbsolutePath()); + preferences.setString(R.string.p_backup_dir, temporaryDirectory.getAbsolutePath()); + // make a temporary task Task task = new Task(); task.setTitle("helicopter"); @@ -77,7 +74,6 @@ public class BackupServiceTests extends DatabaseTestCase { // create a backup BackupIntentService service = new BackupIntentService(); - service.setBackupDirectorySetting(setting); service.testBackup(xmlExporter, preferences, getContext()); AndroidUtilities.sleepDeep(BACKUP_WAIT_TIME); @@ -116,7 +112,6 @@ public class BackupServiceTests extends DatabaseTestCase { // backup BackupIntentService service = new BackupIntentService(); - service.setBackupDirectorySetting(setting); service.testBackup(xmlExporter, preferences, getContext()); AndroidUtilities.sleepDeep(BACKUP_WAIT_TIME); diff --git a/src/main/AndroidManifest.xml b/src/main/AndroidManifest.xml index d254a131b..e0a8eb91c 100644 --- a/src/main/AndroidManifest.xml +++ b/src/main/AndroidManifest.xml @@ -170,6 +170,11 @@ android:label="@string/miscellaneous" android:theme="@style/Tasks" /> + + = UpgradeService.V3_0_0 && !context.getDatabasePath(database.getName()).exists()) { // we didn't have a database! restore latest file - File directory = BackupConstants.defaultExportDirectory(); + File directory = preferences.getBackupDirectory(); if(!directory.exists()) { return; } diff --git a/src/main/java/org/tasks/activities/ExportTaskActivity.java b/src/main/java/org/tasks/activities/ExportTaskActivity.java index 0eef8256b..3f0b35e08 100644 --- a/src/main/java/org/tasks/activities/ExportTaskActivity.java +++ b/src/main/java/org/tasks/activities/ExportTaskActivity.java @@ -15,6 +15,6 @@ public class ExportTaskActivity extends InjectingActivity { @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); - xmlExporter.exportTasks(ExportTaskActivity.this, TasksXmlExporter.ExportType.EXPORT_TYPE_MANUAL, null); + xmlExporter.exportTasks(ExportTaskActivity.this, TasksXmlExporter.ExportType.EXPORT_TYPE_MANUAL); } } diff --git a/src/main/java/org/tasks/activities/ImportTaskActivity.java b/src/main/java/org/tasks/activities/ImportTaskActivity.java index e51f2bb45..5f4ade48e 100644 --- a/src/main/java/org/tasks/activities/ImportTaskActivity.java +++ b/src/main/java/org/tasks/activities/ImportTaskActivity.java @@ -4,19 +4,20 @@ import android.app.AlertDialog; import android.content.DialogInterface; import android.os.Bundle; -import com.todoroo.astrid.backup.BackupConstants; import com.todoroo.astrid.backup.FilePickerBuilder; import com.todoroo.astrid.backup.TasksXmlImporter; import com.todoroo.astrid.utility.Flags; import org.tasks.R; import org.tasks.injection.InjectingActivity; +import org.tasks.preferences.Preferences; import javax.inject.Inject; public class ImportTaskActivity extends InjectingActivity { @Inject TasksXmlImporter xmlImporter; + @Inject Preferences preferences; private boolean initiatedImport; @@ -24,7 +25,7 @@ public class ImportTaskActivity extends InjectingActivity { protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); AlertDialog filePicker = - new FilePickerBuilder(this, R.string.import_file_prompt, BackupConstants.defaultExportDirectory()) + new FilePickerBuilder(this, R.string.import_file_prompt, preferences.getBackupDirectory()) .setOnFilePickedListener(new FilePickerBuilder.OnFilePickedListener() { @Override public void onFilePicked(String filePath) { diff --git a/src/main/java/org/tasks/injection/ActivityModule.java b/src/main/java/org/tasks/injection/ActivityModule.java index 5e9f89c4d..933344257 100644 --- a/src/main/java/org/tasks/injection/ActivityModule.java +++ b/src/main/java/org/tasks/injection/ActivityModule.java @@ -33,6 +33,7 @@ import org.tasks.activities.ExportTaskActivity; import org.tasks.activities.ImportTaskActivity; import org.tasks.activities.PurgeDeletedActivity; import org.tasks.preferences.AppearancePreferences; +import org.tasks.preferences.BackupPreferences; import org.tasks.preferences.BasicPreferences; import org.tasks.preferences.HelpAndFeedbackActivity; import org.tasks.preferences.MiscellaneousPreferences; @@ -80,7 +81,8 @@ import dagger.Provides; ClearGtaskDataActivity.class, ReminderPreferences.class, HelpAndFeedbackActivity.class, - AppearancePreferences.class + AppearancePreferences.class, + BackupPreferences.class }) public class ActivityModule { diff --git a/src/main/java/org/tasks/preferences/BackupPreferences.java b/src/main/java/org/tasks/preferences/BackupPreferences.java new file mode 100644 index 000000000..a0d5791fc --- /dev/null +++ b/src/main/java/org/tasks/preferences/BackupPreferences.java @@ -0,0 +1,61 @@ +package org.tasks.preferences; + +import android.content.Intent; +import android.os.Bundle; +import android.preference.Preference; + +import com.todoroo.astrid.files.FileExplore; + +import org.tasks.R; +import org.tasks.injection.InjectingPreferenceActivity; + +import java.io.File; + +import javax.inject.Inject; + +public class BackupPreferences extends InjectingPreferenceActivity { + + private static final int REQUEST_CODE_BACKUP_DIR = 2; + + @Inject Preferences preferences; + + @Override + public void onCreate(Bundle savedInstanceState) { + super.onCreate(savedInstanceState); + + addPreferencesFromResource(R.xml.preferences_backup); + + initializeBackupDirectory(); + } + + @Override + protected void onActivityResult(int requestCode, int resultCode, Intent data) { + if (requestCode == REQUEST_CODE_BACKUP_DIR && resultCode == RESULT_OK) { + if (data != null) { + String dir = data.getStringExtra(FileExplore.RESULT_DIR_SELECTED); + preferences.setString(R.string.p_backup_dir, dir); + updateBackupDirectory(); + } + } else { + super.onActivityResult(requestCode, resultCode, data); + } + } + + private void initializeBackupDirectory() { + findPreference(getString(R.string.p_backup_dir)).setOnPreferenceClickListener(new Preference.OnPreferenceClickListener() { + @Override + public boolean onPreferenceClick(Preference p) { + Intent filesDir = new Intent(BackupPreferences.this, FileExplore.class); + filesDir.putExtra(FileExplore.EXTRA_DIRECTORIES_SELECTABLE, true); + startActivityForResult(filesDir, REQUEST_CODE_BACKUP_DIR); + return true; + } + }); + updateBackupDirectory(); + } + + private void updateBackupDirectory() { + File dir = preferences.getBackupDirectory(); + findPreference(getString(R.string.p_backup_dir)).setSummary(dir.getAbsolutePath()); + } +} diff --git a/src/main/java/org/tasks/preferences/BasicPreferences.java b/src/main/java/org/tasks/preferences/BasicPreferences.java index 5891d0da4..d9461e424 100644 --- a/src/main/java/org/tasks/preferences/BasicPreferences.java +++ b/src/main/java/org/tasks/preferences/BasicPreferences.java @@ -15,26 +15,17 @@ public class BasicPreferences extends InjectingPreferenceActivity { public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); - String action = getIntent().getAction(); - if (action == null) { - addPreferencesFromResource(R.xml.preferences); - if (!getResources().getBoolean(R.bool.sync_enabled)) { - getPreferenceScreen().removePreference(findPreference(getString(R.string.synchronization))); - } - findPreference(getString(R.string.EPr_appearance_header)).setOnPreferenceClickListener(new Preference.OnPreferenceClickListener() { - @Override - public boolean onPreferenceClick(Preference preference) { - startActivityForResult(new Intent(BasicPreferences.this, AppearancePreferences.class), RC_PREFS); - return true; - } - }); - } else if (action.equals(getString(R.string.EPr_appearance_header))) { - toolbar.setTitle(getString(R.string.EPr_appearance_header)); - addPreferencesFromResource(R.xml.preferences_appearance); - } else if (action.equals(getString(R.string.backup_BPr_header))) { - toolbar.setTitle(getString(R.string.backup_BPr_header)); - addPreferencesFromResource(R.xml.preferences_backup); + addPreferencesFromResource(R.xml.preferences); + if (!getResources().getBoolean(R.bool.sync_enabled)) { + getPreferenceScreen().removePreference(findPreference(getString(R.string.synchronization))); } + findPreference(getString(R.string.EPr_appearance_header)).setOnPreferenceClickListener(new Preference.OnPreferenceClickListener() { + @Override + public boolean onPreferenceClick(Preference preference) { + startActivityForResult(new Intent(BasicPreferences.this, AppearancePreferences.class), RC_PREFS); + return true; + } + }); } @Override diff --git a/src/main/java/org/tasks/preferences/MiscellaneousPreferences.java b/src/main/java/org/tasks/preferences/MiscellaneousPreferences.java index e6913f1a1..d05fd9be9 100644 --- a/src/main/java/org/tasks/preferences/MiscellaneousPreferences.java +++ b/src/main/java/org/tasks/preferences/MiscellaneousPreferences.java @@ -5,7 +5,6 @@ import android.os.Bundle; import android.preference.Preference; import android.speech.tts.TextToSpeech; -import com.todoroo.astrid.data.TaskAttachment; import com.todoroo.astrid.files.FileExplore; import com.todoroo.astrid.gcal.CalendarAlarmScheduler; import com.todoroo.astrid.voice.VoiceOutputAssistant; @@ -55,7 +54,7 @@ public class MiscellaneousPreferences extends InjectingPreferenceActivity { if (requestCode == REQUEST_CODE_FILES_DIR && resultCode == RESULT_OK) { if (data != null) { String dir = data.getStringExtra(FileExplore.RESULT_DIR_SELECTED); - preferences.setString(TaskAttachment.FILES_DIRECTORY_PREF, dir); + preferences.setString(R.string.p_attachment_dir, dir); updateAttachmentDirectory(); } return; @@ -87,7 +86,7 @@ public class MiscellaneousPreferences extends InjectingPreferenceActivity { } private void initializeAttachmentDirectoryPreference() { - findPreference(getString(R.string.p_files_dir)).setOnPreferenceClickListener(new Preference.OnPreferenceClickListener() { + findPreference(getString(R.string.p_attachment_dir)).setOnPreferenceClickListener(new Preference.OnPreferenceClickListener() { @Override public boolean onPreferenceClick(Preference p) { Intent filesDir = new Intent(MiscellaneousPreferences.this, FileExplore.class); @@ -101,7 +100,7 @@ public class MiscellaneousPreferences extends InjectingPreferenceActivity { private void updateAttachmentDirectory() { File dir = preferences.getAttachmentsDirectory(); - findPreference(getString(R.string.p_files_dir)).setSummary(dir.getAbsolutePath()); + findPreference(getString(R.string.p_attachment_dir)).setSummary(dir.getAbsolutePath()); } private void initializeCalendarReminderPreference() { diff --git a/src/main/java/org/tasks/preferences/Preferences.java b/src/main/java/org/tasks/preferences/Preferences.java index 794bab53b..27bb37348 100644 --- a/src/main/java/org/tasks/preferences/Preferences.java +++ b/src/main/java/org/tasks/preferences/Preferences.java @@ -292,7 +292,7 @@ public class Preferences { public File getAttachmentsDirectory() { File directory = null; - String customDir = getStringValue(TaskAttachment.FILES_DIRECTORY_PREF); + String customDir = getStringValue(R.string.p_attachment_dir); if (!TextUtils.isEmpty(customDir)) { directory = new File(customDir); } @@ -343,4 +343,31 @@ public class Preferences { } return tempName + extension; } + + public File getBackupDirectory() { + File directory = null; + String customDir = getStringValue(R.string.p_backup_dir); + if (!TextUtils.isEmpty(customDir)) { + directory = new File(customDir); + } + + if (directory == null || !directory.exists()) { + directory = defaultExportDirectory(); + } + + return directory; + } + + /** + * @return export directory for tasks, or null if no SD card + */ + private static File defaultExportDirectory() { + String storageState = Environment.getExternalStorageState(); + if (storageState.equals(Environment.MEDIA_MOUNTED)) { + String path = Environment.getExternalStorageDirectory().getAbsolutePath(); + path = path + "/astrid"; + return new File(path); + } + return null; + } } diff --git a/src/main/java/org/tasks/scheduling/BackupIntentService.java b/src/main/java/org/tasks/scheduling/BackupIntentService.java index 9313bd328..f907c070b 100644 --- a/src/main/java/org/tasks/scheduling/BackupIntentService.java +++ b/src/main/java/org/tasks/scheduling/BackupIntentService.java @@ -2,7 +2,6 @@ package org.tasks.scheduling; import android.content.Context; -import com.todoroo.astrid.backup.BackupConstants; import com.todoroo.astrid.backup.TasksXmlExporter; import org.slf4j.Logger; @@ -60,8 +59,7 @@ public class BackupIntentService extends MidnightIntentService { } try { - xmlExporter.exportTasks(context, TasksXmlExporter.ExportType.EXPORT_TYPE_SERVICE, - backupDirectorySetting.getBackupDirectory()); + xmlExporter.exportTasks(context, TasksXmlExporter.ExportType.EXPORT_TYPE_SERVICE); } catch (Exception e) { log.error(e.getMessage(), e); } @@ -77,7 +75,7 @@ public class BackupIntentService extends MidnightIntentService { return false; } }; - File astridDir = backupDirectorySetting.getBackupDirectory(); + File astridDir = preferences.getBackupDirectory(); if(astridDir == null) { return; } @@ -100,25 +98,4 @@ public class BackupIntentService extends MidnightIntentService { } } } - - /** - * Interface for setting where backups go - * @author Tim Su - * - */ - public interface BackupDirectorySetting { - public File getBackupDirectory(); - } - - private BackupDirectorySetting backupDirectorySetting = new BackupDirectorySetting() { - @Override - public File getBackupDirectory() { - return BackupConstants.defaultExportDirectory(); - } - }; - - void setBackupDirectorySetting( - BackupDirectorySetting backupDirectorySetting) { - this.backupDirectorySetting = backupDirectorySetting; - } } diff --git a/src/main/res/values/keys.xml b/src/main/res/values/keys.xml index f08900910..9e26b02a1 100644 --- a/src/main/res/values/keys.xml +++ b/src/main/res/values/keys.xml @@ -9,7 +9,8 @@ - p_download_dir + custom_files_dir + p_backup_dir notif_enabled enable_qhours diff --git a/src/main/res/values/strings.xml b/src/main/res/values/strings.xml index 29110fd11..b5041e7fb 100644 --- a/src/main/res/values/strings.xml +++ b/src/main/res/values/strings.xml @@ -75,6 +75,7 @@ Vibrate Quiet hours Attachment directory + Backup directory Debug logging Miscellaneous Synchronization diff --git a/src/main/res/xml/preferences.xml b/src/main/res/xml/preferences.xml index 285816e52..2f9201062 100644 --- a/src/main/res/xml/preferences.xml +++ b/src/main/res/xml/preferences.xml @@ -27,8 +27,7 @@ diff --git a/src/main/res/xml/preferences_backup.xml b/src/main/res/xml/preferences_backup.xml index e3646e30b..30647d232 100644 --- a/src/main/res/xml/preferences_backup.xml +++ b/src/main/res/xml/preferences_backup.xml @@ -6,6 +6,10 @@ + + diff --git a/src/main/res/xml/preferences_misc.xml b/src/main/res/xml/preferences_misc.xml index 4bea2617d..3466c3d5c 100644 --- a/src/main/res/xml/preferences_misc.xml +++ b/src/main/res/xml/preferences_misc.xml @@ -3,7 +3,7 @@ android:title="@string/miscellaneous">