Configurable backup directory

Closes #186
pull/281/head
Alex Baker 10 years ago
parent b41cb5e85e
commit 5051aa2e72

@ -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);

@ -170,6 +170,11 @@
android:label="@string/miscellaneous"
android:theme="@style/Tasks" />
<activity
android:name=".preferences.BackupPreferences"
android:label="@string/backup_BPr_header"
android:theme="@style/Tasks" />
<activity
android:name=".preferences.HelpAndFeedbackActivity"
android:label="@string/help_and_feedback"

@ -5,10 +5,6 @@
*/
package com.todoroo.astrid.backup;
import android.os.Environment;
import java.io.File;
/**
* Constants for backup XML attributes and nodes.
*
@ -45,26 +41,9 @@ public class BackupConstants {
public static final String XML_ENCODING = "utf-8";
public static final String ASTRID_DIR = "/astrid";
public static final String EXPORT_FILE_NAME = "user.%s.xml";
public static final String BACKUP_FILE_NAME = "auto.%s.xml";
public static final String UPGRADE_FILE_NAME = "upgradefrom.%s.xml";
// --- methods
/**
* @return export directory for tasks, or null if no SD card
*/
public static File defaultExportDirectory() {
String storageState = Environment.getExternalStorageState();
if (storageState.equals(Environment.MEDIA_MOUNTED)) {
String path = Environment.getExternalStorageDirectory().getAbsolutePath();
path = path + ASTRID_DIR;
return new File(path);
}
return null;
}
}

@ -52,7 +52,7 @@ public class TasksXmlExporter {
// --- public interface
public static enum ExportType {
public enum ExportType {
EXPORT_TYPE_SERVICE,
EXPORT_TYPE_MANUAL,
EXPORT_TYPE_ON_UPGRADE
@ -100,11 +100,10 @@ public class TasksXmlExporter {
this.preferences = preferences;
}
public void exportTasks(final Context context, final ExportType exportType, File backupDirectoryOverride) {
public void exportTasks(final Context context, final ExportType exportType) {
this.context = context;
this.exportCount = 0;
this.backupDirectory = backupDirectoryOverride == null ?
BackupConstants.defaultExportDirectory() : backupDirectoryOverride;
this.backupDirectory = preferences.getBackupDirectory();
this.latestSetVersionName = null;
handler = exportType == ExportType.EXPORT_TYPE_MANUAL ? new Handler() : null;

@ -82,9 +82,6 @@ public final class TaskAttachment extends RemoteModel {
/** default directory for files on external storage */
public static final String FILES_DIRECTORY_DEFAULT = "attachments"; //$NON-NLS-1$
/** preference key for some other download directory */
public static final String FILES_DIRECTORY_PREF = "custom_files_dir"; //$NON-NLS-1$
/** Constants for file types */
public static final String FILE_TYPE_AUDIO = "audio/"; //$NON-NLS-1$
public static final String FILE_TYPE_IMAGE = "image/"; //$NON-NLS-1$

@ -210,7 +210,7 @@ public class StartupService {
if(preferences.getCurrentVersion() >= 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;
}

@ -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);
}
}

@ -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) {

@ -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 {

@ -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());
}
}

@ -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

@ -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() {

@ -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;
}
}

@ -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 <tim@todoroo.com>
*
*/
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;
}
}

@ -9,7 +9,8 @@
<!-- ======================================================== REMINDERS == -->
<string name="p_files_dir">p_download_dir</string>
<string name="p_attachment_dir">custom_files_dir</string>
<string name="p_backup_dir">p_backup_dir</string>
<string name="p_rmd_enabled">notif_enabled</string>
<!-- boolean : whether to enable quiet hours or not -->
<string name="p_rmd_enable_quiet">enable_qhours</string>

@ -75,6 +75,7 @@
<string name="vibrate">Vibrate</string>
<string name="quiet_hours">Quiet hours</string>
<string name="attachment_directory">Attachment directory</string>
<string name="backup_directory">Backup directory</string>
<string name="debug_logging">Debug logging</string>
<string name="miscellaneous">Miscellaneous</string>
<string name="synchronization">Synchronization</string>

@ -27,8 +27,7 @@
<Preference android:title="@string/backup_BPr_header">
<intent
android:action="@string/backup_BPr_header"
android:targetClass="org.tasks.preferences.BasicPreferences"
android:targetClass="org.tasks.preferences.BackupPreferences"
android:targetPackage="org.tasks" />
</Preference>

@ -6,6 +6,10 @@
<PreferenceScreen xmlns:android="http://schemas.android.com/apk/res/android"
android:title="@string/backup_BPr_header">
<Preference
android:key="@string/p_backup_dir"
android:title="@string/backup_directory" />
<Preference
android:key="@string/backup_BAc_import"
android:title="@string/backup_BAc_import">

@ -3,7 +3,7 @@
android:title="@string/miscellaneous">
<Preference
android:key="@string/p_files_dir"
android:key="@string/p_attachment_dir"
android:title="@string/attachment_directory" />
<com.todoroo.astrid.ui.MultilineCheckboxPreference

Loading…
Cancel
Save