Add import/export activities

pull/253/head
Alex Baker 9 years ago
parent 333adec1ff
commit c525734d79

@ -6,7 +6,6 @@
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;
@ -74,7 +73,7 @@ public class BackupServiceTests extends DatabaseTestCase {
public void disabled_testBackup() {
assertEquals(0, temporaryDirectory.list().length);
preferences.setLong(BackupPreferences.PREF_BACKUP_LAST_DATE, 0);
preferences.setLong(TasksXmlExporter.PREF_BACKUP_LAST_DATE, 0);
// create a backup
BackupIntentService service = new BackupIntentService();
@ -89,7 +88,7 @@ public class BackupServiceTests extends DatabaseTestCase {
assertTrue(files[0].getName().matches(BackupIntentService.BACKUP_FILE_NAME_REGEX));
// assert summary updated
assertTrue(preferences.getLong(BackupPreferences.PREF_BACKUP_LAST_DATE, 0) > 0);
assertTrue(preferences.getLong(TasksXmlExporter.PREF_BACKUP_LAST_DATE, 0) > 0);
}
public void testDeletion() throws IOException {

@ -171,10 +171,6 @@
android:name="com.todoroo.astrid.activity.EditPreferences"
android:theme="@android:style/Theme" />
<activity
android:name=".preferences.AppearancePreferences"
android:theme="@android:style/Theme"/>
<activity
android:name=".preferences.MiscellaneousPreferences"
android:theme="@android:style/Theme" />
@ -395,8 +391,11 @@
<!-- backup -->
<activity
android:name="com.todoroo.astrid.backup.BackupPreferences"
android:theme="@android:style/Theme"/>
android:name="org.tasks.activities.ExportTaskActivity"
android:theme="@style/ReminderDialog" />
<activity
android:name="org.tasks.activities.ImportTaskActivity"
android:theme="@style/ReminderDialog" />
<!-- premium -->
<activity

@ -12,7 +12,6 @@ import android.preference.PreferenceActivity;
import android.preference.PreferenceScreen;
import com.todoroo.astrid.api.AstridApiConstants;
import com.todoroo.astrid.backup.BackupPreferences;
import com.todoroo.astrid.core.DefaultsPreferences;
import com.todoroo.astrid.core.OldTaskPreferences;
import com.todoroo.astrid.gtasks.GtasksPreferences;
@ -21,12 +20,8 @@ import com.todoroo.astrid.service.StartupService;
import org.tasks.R;
import org.tasks.injection.InjectingPreferenceActivity;
import org.tasks.preferences.AppearancePreferences;
import org.tasks.preferences.MiscellaneousPreferences;
import java.util.ArrayList;
import java.util.List;
import javax.inject.Inject;
/**
@ -48,20 +43,14 @@ public class EditPreferences extends InjectingPreferenceActivity {
addPreferencesFromResource(R.xml.preferences);
List<Preference> preferences = new ArrayList<Preference>() {{
add(getPreference(AppearancePreferences.class, R.string.EPr_appearance_header));
add(getPreference(ReminderPreferences.class, R.string.notifications));
add(getPreference(DefaultsPreferences.class, R.string.task_defaults));
add(getPreference(GtasksPreferences.class, R.string.gtasks_GPr_header));
add(getPreference(BackupPreferences.class, R.string.backup_BPr_header));
add(getPreference(OldTaskPreferences.class, R.string.EPr_manage_header));
add(getPreference(MiscellaneousPreferences.class, R.string.miscellaneous));
}};
PreferenceScreen screen= getPreferenceScreen();
for (Preference preference : preferences) {
screen.addPreference(preference);
}
addPreferencesFromResource(R.xml.preferences_appearance);
screen.addPreference(getPreference(ReminderPreferences.class, R.string.notifications));
screen.addPreference(getPreference(DefaultsPreferences.class, R.string.task_defaults));
screen.addPreference(getPreference(GtasksPreferences.class, R.string.gtasks_GPr_header));
addPreferencesFromResource(R.xml.preferences_backup);
screen.addPreference(getPreference(OldTaskPreferences.class, R.string.EPr_manage_header));
screen.addPreference(getPreference(MiscellaneousPreferences.class, R.string.miscellaneous));
}
private Preference getPreference(final Class<? extends PreferenceActivity> klass, final int label) {

@ -1,148 +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.res.Resources;
import android.graphics.Color;
import android.os.Bundle;
import android.preference.Preference;
import android.preference.Preference.OnPreferenceClickListener;
import android.view.View;
import android.view.ViewGroup.OnHierarchyChangeListener;
import com.todoroo.andlib.utility.DateUtilities;
import com.todoroo.andlib.utility.DialogUtilities;
import com.todoroo.astrid.utility.Flags;
import com.todoroo.astrid.utility.TodorooPreferenceActivity;
import org.tasks.R;
import org.tasks.preferences.Preferences;
import javax.inject.Inject;
import static org.tasks.date.DateTimeUtils.newDate;
/**
* Displays synchronization preferences and an action panel so users can
* initiate actions from the menu.
*
* @author timsu
*
*/
public class BackupPreferences extends TodorooPreferenceActivity {
public static final String PREF_BACKUP_LAST_DATE = "backupDate"; //$NON-NLS-1$
public static final String PREF_BACKUP_LAST_ERROR = "backupError"; //$NON-NLS-1$
private int statusColor = Color.BLACK;
@Inject Preferences preferences;
@Inject TasksXmlImporter xmlImporter;
@Inject TasksXmlExporter xmlExporter;
@Override
public int getPreferenceResource() {
return R.xml.preferences_backup;
}
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
getListView().setOnHierarchyChangeListener(new OnHierarchyChangeListener() {
@Override
public void onChildViewRemoved(View parent, View child) {
//
}
@Override
public void onChildViewAdded(View parent, View child) {
View view = findViewById(R.id.status);
if(view != null) {
view.setBackgroundColor(statusColor);
}
}
});
findPreference(getString(R.string.backup_BAc_import)).setOnPreferenceClickListener(new OnPreferenceClickListener() {
@Override
public boolean onPreferenceClick(Preference preference) {
importTasks();
return true;
}
});
findPreference(getString(R.string.backup_BAc_export)).setOnPreferenceClickListener(new OnPreferenceClickListener() {
@Override
public boolean onPreferenceClick(Preference preference) {
xmlExporter.exportTasks(BackupPreferences.this, TasksXmlExporter.ExportType.EXPORT_TYPE_MANUAL, null);
return true;
}
});
}
@Override
public void updatePreferences(Preference preference, Object value) {
final Resources r = getResources();
if (r.getString(R.string.backup_BPr_status_key).equals(preference.getKey())) {
String status;
String subtitle = ""; //$NON-NLS-1$
// last backup was error
final long last = preferences.getLong(PREF_BACKUP_LAST_DATE, 0);
final String error = preferences.getStringValue(PREF_BACKUP_LAST_ERROR);
if(error != null) {
status = r.getString(R.string.backup_status_failed);
subtitle = r.getString(R.string.backup_status_failed_subtitle);
statusColor = Color.rgb(100, 0, 0);
preference.setOnPreferenceClickListener(new OnPreferenceClickListener() {
@Override
public boolean onPreferenceClick(Preference p) {
DialogUtilities.okDialog(BackupPreferences.this, error, null);
return true;
}
});
} else if(last > 0) {
status = r.getString(R.string.backup_status_success,
DateUtilities.getDateStringWithTime(BackupPreferences.this,
newDate(last)));
statusColor = Color.rgb(0, 100, 0);
preference.setOnPreferenceClickListener(null);
} else {
status = r.getString(R.string.backup_status_never);
statusColor = Color.rgb(0, 0, 100);
preference.setOnPreferenceClickListener(null);
}
preference.setTitle(status);
preference.setSummary(subtitle);
View view = findViewById(R.id.status);
if(view != null) {
view.setBackgroundColor(statusColor);
}
}
}
private void importTasks() {
FilePickerBuilder.OnFilePickedListener listener = new FilePickerBuilder.OnFilePickedListener() {
@Override
public void onFilePicked(String filePath) {
xmlImporter.importTasks(BackupPreferences.this, filePath, new Runnable() {
@Override
public void run() {
Flags.set(Flags.REFRESH);
}
});
}
};
new FilePickerBuilder(this,
getString(R.string.import_file_prompt),
BackupConstants.defaultExportDirectory(),
listener).show();
}
}

@ -26,12 +26,12 @@ public class FilePickerBuilder extends AlertDialog.Builder implements DialogInte
void onFilePicked(String filePath);
}
private final OnFilePickedListener callback;
private OnFilePickedListener onFilePickedListener;
private File path;
private String[] files;
private String path;
private FilenameFilter filter;
public FilePickerBuilder(Context ctx, String title, File path, OnFilePickedListener callback) {
public FilePickerBuilder(Context ctx, int titleRes, File path) {
super(ctx);
filter = new FilenameFilter() {
@Override
@ -40,15 +40,17 @@ public class FilePickerBuilder extends AlertDialog.Builder implements DialogInte
return file.isFile();
}
};
this.callback = callback;
setTitle(title);
setTitle(ctx.getString(titleRes));
setPath(path);
}
private void setPath(File path) {
if (path != null && path.exists()) {
this.path = path.getAbsolutePath();
public void setOnFilePickedListener(OnFilePickedListener onFilePickedListener) {
this.onFilePickedListener = onFilePickedListener;
}
private void setPath(final File path) {
if (path != null && path.exists()) {
this.path = path;
File[] filesAsFile = path.listFiles(filter);
AndroidUtilities.sortFilesByDateDesc(filesAsFile);
@ -65,9 +67,9 @@ public class FilePickerBuilder extends AlertDialog.Builder implements DialogInte
}
@Override
public void onClick(DialogInterface dialogInterface, int i) {
if (callback != null) {
callback.onFilePicked(path + "/" + files[i]);
public void onClick(DialogInterface dialog, int which) {
if (onFilePickedListener != null) {
onFilePickedListener.onFilePicked(path.getAbsolutePath() + "/" + files[which]);
}
}
}

@ -48,6 +48,8 @@ public class TasksXmlExporter {
private static final Logger log = LoggerFactory.getLogger(TasksXmlExporter.class);
public static final String PREF_BACKUP_LAST_DATE = "backupDate"; //$NON-NLS-1$
// --- public interface
public static enum ExportType {
@ -132,8 +134,7 @@ public class TasksXmlExporter {
doTasksExport(output);
}
preferences.setLong(BackupPreferences.PREF_BACKUP_LAST_DATE, DateUtilities.now());
preferences.setString(BackupPreferences.PREF_BACKUP_LAST_ERROR, null);
preferences.setLong(PREF_BACKUP_LAST_DATE, DateUtilities.now());
if (exportType == ExportType.EXPORT_TYPE_MANUAL) {
onFinishExport(output);
@ -146,6 +147,7 @@ public class TasksXmlExporter {
public void run() {
if(progressDialog.isShowing() && context instanceof Activity) {
DialogUtilities.dismissDialog((Activity) context, progressDialog);
((Activity) context).finish();
}
}
});

@ -0,0 +1,20 @@
package org.tasks.activities;
import android.os.Bundle;
import com.todoroo.astrid.backup.TasksXmlExporter;
import org.tasks.injection.InjectingActivity;
import javax.inject.Inject;
public class ExportTaskActivity extends InjectingActivity {
@Inject TasksXmlExporter xmlExporter;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
xmlExporter.exportTasks(ExportTaskActivity.this, TasksXmlExporter.ExportType.EXPORT_TYPE_MANUAL, null);
}
}

@ -0,0 +1,51 @@
package org.tasks.activities;
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 javax.inject.Inject;
public class ImportTaskActivity extends InjectingActivity {
@Inject TasksXmlImporter xmlImporter;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
FilePickerBuilder filePickerBuilder = new FilePickerBuilder(this,
R.string.import_file_prompt, BackupConstants.defaultExportDirectory());
filePickerBuilder.setOnFilePickedListener(new FilePickerBuilder.OnFilePickedListener() {
@Override
public void onFilePicked(String filePath) {
xmlImporter.importTasks(ImportTaskActivity.this, filePath, new Runnable() {
@Override
public void run() {
Flags.set(Flags.REFRESH);
finish();
}
});
}
});
filePickerBuilder.setOnDismissListener(new DialogInterface.OnDismissListener() {
@Override
public void onDismiss(DialogInterface dialog) {
finish();
}
});
filePickerBuilder.setOnCancelListener(new DialogInterface.OnCancelListener() {
@Override
public void onCancel(DialogInterface dialog) {
finish();
}
});
filePickerBuilder.show();
}
}

@ -10,7 +10,6 @@ import com.todoroo.astrid.activity.FilterShortcutActivity;
import com.todoroo.astrid.activity.ShareLinkActivity;
import com.todoroo.astrid.activity.TaskEditActivity;
import com.todoroo.astrid.activity.TaskListActivity;
import com.todoroo.astrid.backup.BackupPreferences;
import com.todoroo.astrid.calls.MissedCallActivity;
import com.todoroo.astrid.core.CustomFilterActivity;
import com.todoroo.astrid.core.DefaultsPreferences;
@ -26,6 +25,8 @@ import com.todoroo.astrid.tags.DeleteTagActivity;
import com.todoroo.astrid.tags.RenameTagActivity;
import com.todoroo.astrid.widget.WidgetConfigActivity;
import org.tasks.activities.ExportTaskActivity;
import org.tasks.activities.ImportTaskActivity;
import org.tasks.preferences.MiscellaneousPreferences;
import org.tasks.reminders.SnoozeActivity;
import org.tasks.voice.VoiceCommandActivity;
@ -55,14 +56,15 @@ import dagger.Provides;
EditPreferences.class,
GtasksPreferences.class,
OldTaskPreferences.class,
BackupPreferences.class,
FilterShortcutActivity.class,
BeastModePreferences.class,
DefaultsPreferences.class,
ReminderPreferences.class,
AACRecordingActivity.class,
SnoozeActivity.class,
MiscellaneousPreferences.class
MiscellaneousPreferences.class,
ImportTaskActivity.class,
ExportTaskActivity.class
})
public class ActivityModule {

@ -1,15 +0,0 @@
package org.tasks.preferences;
import android.os.Bundle;
import android.preference.PreferenceActivity;
import org.tasks.R;
public class AppearancePreferences extends PreferenceActivity {
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
addPreferencesFromResource(R.xml.preferences_appearance);
}
}

@ -3,7 +3,6 @@ package org.tasks.scheduling;
import android.content.Context;
import com.todoroo.astrid.backup.BackupConstants;
import com.todoroo.astrid.backup.BackupPreferences;
import com.todoroo.astrid.backup.TasksXmlExporter;
import org.slf4j.Logger;
@ -38,7 +37,7 @@ public class BackupIntentService extends MidnightIntentService {
@Override
String getLastRunPreference() {
return BackupPreferences.PREF_BACKUP_LAST_DATE;
return TasksXmlExporter.PREF_BACKUP_LAST_DATE;
}
/**
@ -65,7 +64,6 @@ public class BackupIntentService extends MidnightIntentService {
backupDirectorySetting.getBackupDirectory());
} catch (Exception e) {
log.error(e.getMessage(), e);
preferences.setString(BackupPreferences.PREF_BACKUP_LAST_ERROR, e.toString());
}
}

@ -216,9 +216,6 @@
<!-- ============================================================ OTHER == -->
<!-- Preference Key (do not translate) -->
<string name="backup_BPr_status_key">backup_status</string>
<!-- Default Calendar Preference Key (do not translate) -->
<string name="gcal_p_default">default_calendar_id</string>

@ -8,18 +8,6 @@
<!-- slide 33c/48d: Backup Preferences Title -->
<string name="backup_BPr_header">Backups</string>
<!-- slide 48e/50c: Backup: Status Header -->
<string name="backup_BPr_group_status">Status</string>
<!-- Backup Status: last backup was a success (%s -> last date). Keep it short! -->
<string name="backup_status_success">Latest backup:\n%s</string>
<!-- Backup Status: last error failed. Keep it short! -->
<string name="backup_status_failed">Last backup failed</string>
<!-- Backup Status: error subtitle -->
<string name="backup_status_failed_subtitle">(tap to show error)</string>
<!-- slide 48a: Backup Status: never backed up -->
<string name="backup_status_never">Never backed up!</string>
<!-- backup activity import button -->
<string name="backup_BAc_import">Import tasks</string>

@ -2,69 +2,72 @@
<PreferenceScreen xmlns:android="http://schemas.android.com/apk/res/android"
android:title="@string/EPr_appearance_header">
<CheckBoxPreference
android:defaultValue="false"
android:key="@string/p_use_dark_theme"
android:title="@string/EPr_use_dark_theme" />
<PreferenceScreen android:title="@string/EPr_appearance_header">
<PreferenceCategory android:title="@string/task_list_options">
<com.todoroo.astrid.ui.MultilineListPreference
android:entries="@array/EPr_font_size"
android:entryValues="@array/EPr_font_size"
android:key="@string/p_fontSize"
android:summary="@string/EPr_fontSize_desc"
android:title="@string/EPr_fontSize_title" />
<com.todoroo.astrid.ui.MultilineCheckboxPreference
<CheckBoxPreference
android:defaultValue="false"
android:key="@string/p_fullTaskTitle"
android:summaryOff="@string/EPr_fullTask_desc_disabled"
android:summaryOn="@string/EPr_fullTask_desc_enabled"
android:title="@string/EPr_fullTask_title" />
android:key="@string/p_use_dark_theme"
android:title="@string/EPr_use_dark_theme" />
</PreferenceCategory>
<PreferenceCategory android:title="@string/task_list_options">
<com.todoroo.astrid.ui.MultilineListPreference
android:entries="@array/EPr_font_size"
android:entryValues="@array/EPr_font_size"
android:key="@string/p_fontSize"
android:summary="@string/EPr_fontSize_desc"
android:title="@string/EPr_fontSize_title" />
<PreferenceCategory android:title="@string/EPr_edit_screen_options">
<Preference android:title="@string/EPr_beastMode_title">
<intent
android:targetClass="com.todoroo.astrid.activity.BeastModePreferences"
android:targetPackage="org.tasks" />
</Preference>
<com.todoroo.astrid.ui.MultilineCheckboxPreference
android:defaultValue="false"
android:key="@string/p_fullTaskTitle"
android:summaryOff="@string/EPr_fullTask_desc_disabled"
android:summaryOn="@string/EPr_fullTask_desc_enabled"
android:title="@string/EPr_fullTask_title" />
<com.todoroo.astrid.ui.MultilineCheckboxPreference
android:defaultValue="true"
android:key="@string/p_show_task_edit_comments"
android:title="@string/EPr_show_task_edit_comments" />
</PreferenceCategory>
<com.todoroo.astrid.ui.MultilineCheckboxPreference
android:defaultValue="true"
android:key="@string/p_time_increment"
android:title="@string/EPr_time_increment" />
<PreferenceCategory android:title="@string/EPr_edit_screen_options">
<Preference android:title="@string/EPr_beastMode_title">
<intent
android:targetClass="com.todoroo.astrid.activity.BeastModePreferences"
android:targetPackage="org.tasks" />
</Preference>
<com.todoroo.astrid.ui.MultilineCheckboxPreference
android:defaultValue="false"
android:key="@string/p_show_timer_shortcut"
android:title="@string/EPr_show_timer_shortcut" />
</PreferenceCategory>
<com.todoroo.astrid.ui.MultilineCheckboxPreference
android:defaultValue="true"
android:key="@string/p_show_task_edit_comments"
android:title="@string/EPr_show_task_edit_comments" />
<com.todoroo.astrid.ui.MultilineCheckboxPreference
android:defaultValue="true"
android:key="@string/p_time_increment"
android:title="@string/EPr_time_increment" />
<com.todoroo.astrid.ui.MultilineCheckboxPreference
android:defaultValue="false"
android:key="@string/p_show_timer_shortcut"
android:title="@string/EPr_show_timer_shortcut" />
</PreferenceCategory>
<PreferenceCategory android:title="@string/EPr_filters_to_show_title">
<com.todoroo.astrid.ui.MultilineCheckboxPreference
android:defaultValue="true"
android:enabled="false"
android:key="@string/p_show_my_tasks_filter"
android:title="@string/BFE_Active" />
<com.todoroo.astrid.ui.MultilineCheckboxPreference
android:defaultValue="true"
android:key="@string/p_show_today_filter"
android:title="@string/today" />
<com.todoroo.astrid.ui.MultilineCheckboxPreference
android:defaultValue="true"
android:key="@string/p_show_recently_modified_filter"
android:title="@string/BFE_Recent" />
<com.todoroo.astrid.ui.MultilineCheckboxPreference
android:defaultValue="true"
android:key="@string/p_show_not_in_list_filter"
android:title="@string/tag_FEx_untagged" />
</PreferenceCategory>
<PreferenceCategory android:title="@string/EPr_filters_to_show_title">
<com.todoroo.astrid.ui.MultilineCheckboxPreference
android:defaultValue="true"
android:enabled="false"
android:key="@string/p_show_my_tasks_filter"
android:title="@string/BFE_Active" />
<com.todoroo.astrid.ui.MultilineCheckboxPreference
android:defaultValue="true"
android:key="@string/p_show_today_filter"
android:title="@string/today" />
<com.todoroo.astrid.ui.MultilineCheckboxPreference
android:defaultValue="true"
android:key="@string/p_show_recently_modified_filter"
android:title="@string/BFE_Recent" />
<com.todoroo.astrid.ui.MultilineCheckboxPreference
android:defaultValue="true"
android:key="@string/p_show_not_in_list_filter"
android:title="@string/tag_FEx_untagged" />
</PreferenceCategory>
</PreferenceScreen>
</PreferenceScreen>

@ -1,29 +1,28 @@
<?xml version="1.0" encoding="utf-8"?>
<!--
<?xml version="1.0" encoding="utf-8"?><!--
** Copyright (c) 2012 Todoroo Inc
**
** See the file "LICENSE" for the full license governing this code.
-->
<PreferenceScreen
xmlns:android="http://schemas.android.com/apk/res/android">
<PreferenceCategory
android:title="@string/backup_BPr_group_status">
<com.todoroo.astrid.ui.MultilinePreference
android:layout="@layout/status_preference"
android:key="@string/backup_BPr_status_key"
android:textSize="24sp"
android:gravity="center"/>
</PreferenceCategory>
<PreferenceScreen xmlns:android="http://schemas.android.com/apk/res/android"
android:title="@string/backup_BPr_header">
<Preference
android:key="@string/backup_BAc_import"
android:title="@string/backup_BAc_import"/>
<PreferenceScreen android:title="@string/backup_BPr_header">
<Preference
android:key="@string/backup_BAc_export"
android:title="@string/backup_BAc_export"/>
<Preference
android:key="@string/backup_BAc_import"
android:title="@string/backup_BAc_import">
<intent
android:targetClass="org.tasks.activities.ImportTaskActivity"
android:targetPackage="org.tasks" />
</Preference>
<Preference
android:key="@string/backup_BAc_export"
android:title="@string/backup_BAc_export">
<intent
android:targetClass="org.tasks.activities.ExportTaskActivity"
android:targetPackage="org.tasks" />
</Preference>
</PreferenceScreen>
</PreferenceScreen>

Loading…
Cancel
Save